/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 655073dd7b32eade2f10f69e1d51fece380d45e1:


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: 36 20 32 30 30 37 2f 30 34 2f 30 39 20 31 31 3a  6 2007/04/09 11:
0360: 32 30 3a 35 34 20 64 61 6e 69 65 6c 6b 31 39 37  20:54 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63   OsFile.** struc
0710: 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65  t as it's argume
0720: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  nt..*/.#define P
0730: 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29  AGERID(p) ((int)
0740: 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65  (p->fd)).#define
0750: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0760: 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a  ) ((int)fd)../*.
0770: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0780: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0790: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
07a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
07b0: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
07c0: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
07d0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07f0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
0800: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0810: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
0820: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
0830: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0840: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0850: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0860: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0870: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0880: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08a0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
08b0: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
08c0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
08d0: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
0910: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
0920: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0950: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0960: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0980: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0990: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
09a0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
09b0: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
09c0: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
09d0: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09e0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
0a10: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
0a20: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
0a30: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a60: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a70: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a80: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0ab0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0ac0: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0af0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0b00: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0b10: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0b20: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0b30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b40: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b50: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b60: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0ba0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0bb0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0bc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0be0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bf0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0c00: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0c30: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c40: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c50: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c60: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c70: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c80: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0ca0: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0cb0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0cc0: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cf0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0d00: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0d10: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0d30: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d40: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d50: 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20  emove or.**     
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a    truncate the j
0d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
0d90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0da0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0db0: 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62            will b
0dc0: 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  e committed..**.
0dd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0de0: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41  e comes up in PA
0df0: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0e00: 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a   first time a.**
0e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
0e20: 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73  () occurs, the s
0e30: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e40: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
0e50: 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70  ..** After all p
0e60: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ages have been r
0e70: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
0e80: 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28  lite_page_unref(
0e90: 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ),.** the state 
0ea0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b  transitions back
0eb0: 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   to PAGER_UNLOCK
0ec0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0ed0: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0ee0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
0ef0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f00: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f10: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f20: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
0f40: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0f50: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0f60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0f70: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0f80: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0f90: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0fa0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
0fb0: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
0fc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0fd0: 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  ).** PAGER_RESER
0fe0: 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74  VED means that t
0ff0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20  here is an open 
1000: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1010: 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ..** The transit
1020: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1030: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62 65  LUSIVE occurs be
1040: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1050: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1060: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1070: 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65 73  e, though writes
1080: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1090: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75  .** journal occu
10a0: 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41 47  rs with just PAG
10b0: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66  ER_RESERVED.  Af
10c0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61  ter an sqlite3Pa
10d0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  gerRollback().**
10e0: 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
10f0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1100: 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e 20  , the state can 
1110: 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  go back to PAGER
1120: 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69  _SHARED,.** or i
1130: 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50 41  t can stay at PA
1140: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66  GER_EXCLUSIVE if
1150: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
1160: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
1170: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1180: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1190: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
11a0: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
11b0: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
11c0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
11d0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
11e0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
11f0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
1200: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1210: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1220: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1230: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1240: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1250: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1260: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1270: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1280: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1290: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
12a0: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
12b0: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
12c0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
12d0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
12e0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12f0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
1300: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
1310: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1320: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1330: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1340: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1350: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1360: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1370: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1380: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1390: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
13a0: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
13b0: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
13c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
13d0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
13e0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
13f0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
1400: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
1410: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1420: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1430: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1440: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1450: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1460: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1470: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1480: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1490: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
14a0: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
14b0: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
14c0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
14d0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
14e0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
14f0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
1500: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
1510: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1520: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1530: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1560: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1570: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1580: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
15a0: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
15b0: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
15c0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
15d0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
15e0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
15f0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
1600: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
1610: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1620: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1630: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1640: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1650: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1660: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1670: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1680: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1690: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
16a0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
16b0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
16c0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
16d0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
16e0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
16f0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1700: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1710: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1720: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1730: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1740: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1750: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1760: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1770: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1780: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17a0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
17b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
17c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
17d0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
17e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
17f0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1800: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1810: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1820: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1830: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1840: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1850: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1860: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1870: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1880: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1890: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
18a0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
18b0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
18c0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
18d0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
18e0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
18f0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1900: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1910: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1920: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1930: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1940: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1950: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1960: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1970: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1980: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1990: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
19a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
19b0: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
19c0: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
19d0: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
19e0: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
19f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1a00: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
1a10: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
1a20: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
1a50: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
1a60: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a70: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a80: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a90: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1aa0: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1ab0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1ac0: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1ad0: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1ae0: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1af0: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1b00: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1b20: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1b30: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1b40: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1b50: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b60: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1b70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1b80: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
1bb0: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
1bc0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
1bd0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf0: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
1c00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
1c10: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
1c20: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
1c40: 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  able DontRollbac
1c50: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
1c60: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74  e */.  short int
1c70: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
1c80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c90: 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69 73  of users of this
1ca0: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
1cb0: 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76   *pDirty, *pPrev
1cc0: 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72  Dirty;    /* Dir
1cd0: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33  ty pages */.  u3
1ce0: 32 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  2 notUsed;      
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d00: 42 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a  Buffer space */.
1d10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1d20: 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20  ECK_PAGES.  u32 
1d30: 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66  pageHash;.#endif
1d40: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61  .  /* pPager->pa
1d50: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1d60: 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77  page data follow
1d70: 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a   this header */.
1d80: 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72    /* Pager.nExtr
1d90: 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c  a bytes of local
1da0: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65   data follow the
1db0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b   page data */.};
1dc0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ../*.** For an i
1dd0: 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61  n-memory only da
1de0: 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74  tabase, some ext
1df0: 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ra information i
1e00: 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74  s recorded about
1e10: 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f  .** each page so
1e20: 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61   that changes ca
1e30: 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1e40: 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .  (Journal file
1e50: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65  s are not.** use
1e60: 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  d for in-memory 
1e70: 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65  databases.)  The
1e80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72   following infor
1e90: 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20  mation is added 
1ea0: 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  to.** the end of
1eb0: 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f   every EXTRA blo
1ec0: 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ck for in-memory
1ed0: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a   databases..**.*
1ee0: 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  * This informati
1ef0: 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  on could have be
1f00: 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c  en added directl
1f10: 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73  y to the PgHdr s
1f20: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74  tructure..** But
1f30: 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74   then it would t
1f40: 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20  ake up an extra 
1f50: 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61  8 bytes of stora
1f60: 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64  ge on every PgHd
1f70: 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69  r.** even for di
1f80: 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  sk-based databas
1f90: 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69  es.  Splitting i
1fa0: 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79  t out saves 8 by
1fb0: 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73  tes.  This.** is
1fc0: 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20   only a savings 
1fd0: 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73  of 0.8% but thos
1fe0: 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64  e percentages ad
1ff0: 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  d up..*/.typedef
2000: 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72   struct PgHistor
2010: 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72  y PgHistory;.str
2020: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a  uct PgHistory {.
2030: 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20    u8 *pOrig;    
2040: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67   /* Original pag
2050: 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65  e text.  Restore
2060: 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75   to this on a fu
2070: 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ll rollback */. 
2080: 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20   u8 *pStmt;     
2090: 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61  /* Text as it wa
20a0: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
20b0: 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ng of the curren
20c0: 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  t statement */. 
20d0: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d   PgHdr *pNextStm
20e0: 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20  t, *pPrevStmt;  
20f0: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
2100: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
2110: 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  t journal */.  u
2120: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2140: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
2150: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2160: 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  rnal */.};../*.*
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 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
4630: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 70 61  eturn true if pa
4640: 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65  ge *pPg has alre
4650: 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
4660: 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
4670: 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72  t.** journal (or
4680: 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73   statement snaps
4690: 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63 72 65  hot has been cre
46a0: 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73  ated, if *pPg is
46b0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69   part.** of an i
46c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
46d0: 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
46e0: 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e  t pageInStatemen
46f0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
4700: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
4710: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
4720: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
4730: 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
4740: 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
4750: 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65  r)->inStmt;.  }e
4760: 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  lse{.    Pgno pg
4770: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
4780: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67      u8 *a = pPag
4790: 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20  er->aInStmt;.   
47a0: 20 72 65 74 75 72 6e 20 28 61 20 26 26 20 28 69   return (a && (i
47b0: 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
47c0: 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b  >stmtSize && (a[
47d0: 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
47e0: 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d  gno&7))));.  }.}
47f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4800: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4810: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4820: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
4830: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
4840: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
4850: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
4860: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
4870: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
4880: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
4890: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
48a0: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
48b0: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73  1))==0 );.  aHas
48c0: 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  h = sqliteMalloc
48d0: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
48e0: 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48  ])*N );.  if( aH
48f0: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
4900: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
4910: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
4920: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
4930: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
4940: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
4950: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4960: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
4970: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
4980: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
4990: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
49a0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
49b0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
49c0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
49d0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
49e0: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
49f0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4a00: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
4a10: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
4a20: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
4a30: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4a40: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
4a50: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
4a60: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
4a70: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
4a80: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
4a90: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
4aa0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
4ab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
4ac0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
4ad0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
4ae0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
4af0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4b00: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
4b10: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4b20: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4b30: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4b40: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4b50: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4b60: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
4b70: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
4b80: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
4b90: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4ba0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
4bb0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
4bc0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
4bd0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
4be0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
4bf0: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4c00: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
4c10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4c20: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4c30: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4c40: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29   ac, sizeof(ac))
4c50: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4c60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4c70: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4c80: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4c90: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4ca0: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [3];.  }.  retur
4cb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
4cc0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4cd0: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
4ce0: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
4cf0: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
4d00: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
4d10: 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63 68  oid put32bits(ch
4d20: 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29  ar *ac, u32 val)
4d30: 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  {.  ac[0] = (val
4d40: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4d50: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4d60: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4d70: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4d80: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4d90: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4da0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4db0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
4dc0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
4dd0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
4de0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
4df0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
4e00: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4e10: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4e20: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4e30: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4e40: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4e50: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4e60: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4e70: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4e80: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4e90: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4ea0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4eb0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4ec0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4ed0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4ee0: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4ef0: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4f00: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4f10: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4f20: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4f30: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4f40: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4f50: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4f60: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4f70: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4f80: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4f90: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4fa0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4fb0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4fc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4fd0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4fe0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4ff0: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
5000: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
5010: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5020: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
5030: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
5040: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
5050: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
5060: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
5070: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
5080: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
5090: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
50a0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
50b0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
50c0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
50d0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
50e0: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
50f0: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
5100: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
5110: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
5120: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
5130: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
5140: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
5150: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
5160: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
5170: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
5180: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
5190: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
51a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
51b0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
51c0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
51d0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
51e0: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
51f0: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
5200: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
5210: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
5220: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
5230: 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d  .  if(.    rc2==
5240: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
5250: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
5260: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
5270: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a  =SQLITE_CORRUPT.
5280: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
5290: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
52a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
52b0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
52c0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
52d0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
52e0: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
52f0: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
5300: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
5310: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
5320: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
5330: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
5340: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5350: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 20  ned char *pData 
5360: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5370: 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   *)PGHDR_TO_DATA
5380: 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69  (pPage);.  for(i
5390: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61  =0; i<pPage->pPa
53a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69  ger->pageSize; i
53b0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
53c0: 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69  (hash+i)^pData[i
53d0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
53e0: 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hash;.}../*.** T
53f0: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
5400: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
5410: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
5420: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
5430: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
5440: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
5450: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
5460: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
5470: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
5480: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
5490: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
54a0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
54b0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
54c0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
54d0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
54e0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
54f0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5500: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
5510: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
5520: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
5530: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
5540: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
5550: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
5560: 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d  || MEMDB || pPg-
5570: 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20  >dirty || .     
5580: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
5590: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
55a0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
55b0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
55c0: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
55d0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
55e0: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
55f0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5600: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
5610: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
5620: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5630: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
5640: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
5650: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
5660: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
5670: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
5680: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
5690: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
56a0: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
56b0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
56c0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
56d0: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
56e0: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
56f0: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
5700: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
5710: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5720: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
5730: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
5740: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
5750: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
5760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5770: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5780: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
5790: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
57a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
57b0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
57c0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
57d0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
57e0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
57f0: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5800: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5810: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5820: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5830: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5840: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5850: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5860: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
5870: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
5880: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5890: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
58a0: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
58b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
58c0: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
58d0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
58e0: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
58f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5900: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5910: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5920: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5930: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5940: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5950: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5960: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5970: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
5980: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
5990: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
59a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
59b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
59c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
59d0: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
59e0: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
59f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5a00: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5a10: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5a20: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5a30: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5a40: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5a50: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5a60: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5a70: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
5a80: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
5a90: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5aa0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
5ab0: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
5ac0: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
5ad0: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5ae0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5af0: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5b00: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5b10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5b20: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5b30: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5b40: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5b50: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5b60: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5b70: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
5b80: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
5b90: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
5ba0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
5bb0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
5bc0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
5bd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5be0: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5bf0: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5c00: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5c10: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5c20: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5c30: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5c40: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5c50: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5c60: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5c70: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5c80: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5c90: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
5cb0: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
5cc0: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5cd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5cf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d00: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5d10: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5d20: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5d30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5d40: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5d50: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5d60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
5d70: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
5d80: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
5d90: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
5da0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
5db0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
5dc0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
5dd0: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
5de0: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
5df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5e10: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
5e30: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5e50: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5e70: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
5e90: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
5ea0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
5eb0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5ec0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5ed0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5ee0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5ef0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5f00: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5f10: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5f20: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5f30: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5f40: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5f50: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5f60: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5f70: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5f80: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5f90: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5fa0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5fb0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5fc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5fd0: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
5fe0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5ff0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
6000: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
6010: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
6020: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
6030: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
6040: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
6050: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
6060: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
6070: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
6080: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
6090: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
60a0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
60b0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
60c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
60d0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
60e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
60f0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
6100: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
6110: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
6120: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
6130: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
6140: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
6150: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
6160: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
6170: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6180: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
6190: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
61a0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
61b0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
61c0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
61d0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
61e0: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
61f0: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6200: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6210: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
6220: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
6230: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
6240: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
6250: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
6260: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
6270: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
6280: 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72  {.  char zHeader
6290: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
62a0: 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e  Magic)+16];.  in
62b0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
62c0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
62d0: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
62e0: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
62f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6300: 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  f;.  }..  rc = s
6310: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6320: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6330: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6340: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6350: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
6360: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
6370: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
6380: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6390: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
63a0: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
63b0: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
63c0: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
63d0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
63e0: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
63f0: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
6400: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
6410: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
6420: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
6430: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
6440: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
6450: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
6460: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
6470: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
6480: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
6490: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
64a0: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
64b0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  */.  memcpy(zHea
64c0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
64d0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
64e0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a  nalMagic));.  /*
64f0: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
6500: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
6510: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
6520: 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
6530: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6540: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
6550: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
6560: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
6570: 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e  0);.  /* The ran
6580: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
6590: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
65a0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
65b0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
65c0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
65d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
65e0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
65f0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6600: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6610: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6620: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6630: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6640: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6650: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6660: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6670: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
6680: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
6690: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
66a0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
66b0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
66c0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
66d0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
66e0: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
66f0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
6700: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
6710: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
6720: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
6730: 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66  urnalHdr, sizeof
6740: 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63  (zHeader))).  rc
6750: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6760: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6770: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
6780: 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20  Header));..  /* 
6790: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
67a0: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
67b0: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
67c0: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
67d0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
67e0: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
67f0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6800: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
6810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6830: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
6840: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
6850: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6860: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
6870: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6880: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6890: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
68a0: 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ff-1);.    if( r
68b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
68c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
68d0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
68e0: 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31  ->jfd, "\000", 1
68f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6900: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6910: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6920: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6930: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
6940: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
6950: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
6960: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6970: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
6980: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
6990: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
69a0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
69b0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
69c0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
69d0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
69e0: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
69f0: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
6a00: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
6a10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
6a20: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
6a30: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
6a40: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6a50: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
6a60: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
6a70: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
6a80: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
6a90: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
6aa0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
6ab0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
6ac0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
6ad0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
6ae0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6af0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
6b00: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
6b10: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
6b20: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
6b30: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
6b40: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
6b50: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
6b60: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
6b70: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
6b80: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
6b90: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
6ba0: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
6bb0: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
6bc0: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
6bd0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
6be0: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
6bf0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6c00: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
6c10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6c30: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
6c40: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
6c50: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
6c60: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
6c70: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
6c80: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
6c90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6ca0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
6cb0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6cc0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6cd0: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
6ce0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6cf0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6d00: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6d10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6d20: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6d30: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6d40: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6d50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6d60: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
6d70: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
6d80: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
6d90: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6da0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6db0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
6dc0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
6dd0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6de0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
6df0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6e00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6e10: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6e20: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6e30: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6e40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6e50: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6e60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
6e70: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6e80: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6e90: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6ea0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6eb0: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
6ec0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6ed0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
6ee0: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
6ef0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
6f00: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
6f10: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
6f20: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
6f30: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
6f40: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
6f50: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
6f60: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
6f70: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
6f80: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
6f90: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
6fa0: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
6fb0: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
6fc0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
6fd0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
6fe0: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
6ff0: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
7000: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
7010: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
7020: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
7030: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
7040: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
7050: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
7060: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7070: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
7080: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
7090: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
70a0: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
70b0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
70c0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
70d0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
70e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
70f0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
7100: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
7110: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
7120: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7130: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
7140: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
7150: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
7160: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7170: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
7180: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
7190: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
71a0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
71b0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
71c0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
71d0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
71e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
71f0: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
7200: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
7210: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
7220: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
7230: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
7240: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
7250: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
7260: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
7270: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
7280: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
7290: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
72a0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
72b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
72c0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
72d0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
72e0: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
72f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7300: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
7310: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
7320: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
7330: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
7340: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
7350: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
7360: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
7370: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
7380: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
7390: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
73a0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
73b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
73c0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
73d0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
73e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
73f0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
7400: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
7410: 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b  int i; .  u32 ck
7420: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
7430: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
7440: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
7450: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
7460: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
7470: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
7480: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
7490: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
74a0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
74b0: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
74c0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
74d0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
74e0: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
74f0: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
7500: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
7510: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
7520: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
7530: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
7540: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7550: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
7560: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
7570: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
7580: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
7590: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
75a0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
75b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
75c0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
75d0: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
75e0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
75f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7600: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7610: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
7620: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7630: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
7640: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
7650: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
7660: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
7670: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7680: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7690: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
76a0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
76b0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
76c0: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
76d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
76e0: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32  urn rc;..  put32
76f0: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7700: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
7710: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
7720: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
7730: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7740: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7750: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
7760: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7770: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
7780: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
7790: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
77a0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
77b0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
77c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
77d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
77e0: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
77f0: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
7800: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
7810: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
7820: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
7830: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
7840: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
7850: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
7860: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
7870: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
7880: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
7890: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
78a0: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
78b0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
78c0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
78d0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
78e0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
78f0: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7900: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7910: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7920: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7930: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7940: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7950: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7960: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7970: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
7980: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48  g->pPager;.  PgH
7990: 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
79a0: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
79b0: 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73  g, pPager);.  as
79c0: 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20  sert( MEMDB );. 
79d0: 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53   if( !pHist->inS
79e0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
79f0: 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53  t( pHist->pPrevS
7a00: 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d  tmt==0 && pHist-
7a10: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b  >pNextStmt==0 );
7a20: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7a30: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
7a40: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
7a50: 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61  ager->pStmt, pPa
7a60: 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20  ger)->pPrevStmt 
7a70: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7a80: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
7a90: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
7aa0: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
7ab0: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Stmt = pPg;.    
7ac0: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
7ad0: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
7ae0: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
7af0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
7b00: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
7b10: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
7b20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7b30: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
7b40: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
7b50: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
7b60: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
7b70: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
7b80: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
7b90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
7ba0: 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e  Hash==0 ) return
7bb0: 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72   0;.  p = pPager
7bc0: 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28  ->aHash[pgno & (
7bd0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
7be0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
7bf0: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
7c00: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
7c10: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
7c20: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7c30: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
7c40: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7c50: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7c60: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
7c70: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
7c80: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
7c90: 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ode ){.    if( !
7ca0: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
7cb0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
7cc0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
7cd0: 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  CK);.      pPage
7ce0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
7cf0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
7d00: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
7d10: 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20  ager)).    }.   
7d20: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7d30: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
7d40: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
7d50: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
7d60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
7d70: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
7d80: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
7d90: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
7da0: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
7db0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
7dc0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
7dd0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
7de0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a  ready entered.**
7df0: 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
7e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7e10: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
7e20: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
7e30: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43  ){.  if( p->errC
7e40: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
7e50: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
7e60: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
7e70: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
7e80: 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  en==0 );.  if( p
7e90: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
7ea0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
7eb0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
7ec0: 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61  ack(p);.  }.  pa
7ed0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20  ger_unlock(p);. 
7ee0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
7ef0: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
7f00: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
7f10: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
7f20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
7f30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
7f40: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
7f50: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
7f60: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a  siveMode );.}...
7f70: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
7f80: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
7f90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
7fa0: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
7fb0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
7fc0: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
7fd0: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
7fe0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
7ff0: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
8000: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
8010: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
8020: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
8030: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
8040: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
8050: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
8060: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
8070: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
8080: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
8090: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
80a0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
80b0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
80c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
80d0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
80e0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
80f0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
8100: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
8110: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
8120: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
8130: 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  >pStmt = 0;.  pP
8140: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
8150: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
8160: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
8170: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
8180: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
8190: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
81a0: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
81b0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
81c0: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
81d0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
81e0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
81f0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
8200: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
8210: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
8220: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
8230: 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20    A transaction 
8240: 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68  is ended by eith
8250: 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f  er.** a COMMIT o
8260: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a  r a ROLLBACK..**
8270: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
8280: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
8290: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
82a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
82b0: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
82c0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
82d0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
82e0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
82f0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c  routine will rel
8300: 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  ease.** the data
8310: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
8320: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
8330: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
8340: 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20  e if that is.** 
8350: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8360: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65  thing to do.  Re
8370: 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61  lease locks usua
8380: 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61  lly is appropria
8390: 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65  te,.** unless we
83a0: 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76   are in exclusiv
83b0: 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72  e access mode or
83c0: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
83d0: 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44  a .** COMMIT AND
83e0: 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41   BEGIN or ROLLBA
83f0: 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65  CK AND BEGIN ope
8400: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
8410: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
8420: 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64  s either deleted
8430: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a   or truncated..*
8440: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
8450: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
8460: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8470: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
8480: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
8490: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
84a0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
84b0: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
84c0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
84d0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
84e0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
84f0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
8500: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
8510: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
8520: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
8530: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
8540: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8550: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
8560: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21  _OK;.  assert( !
8570: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
8580: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
8590: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
85a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
85b0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
85c0: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
85d0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
85e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
85f0: 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78  n && !pPager->ex
8600: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
8610: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8620: 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
8630: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
8640: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
8650: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
8660: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
8670: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
8680: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
8690: 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73        && (rc = s
86a0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
86b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
86c0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b  )==SQLITE_OK ){;
86d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
86e0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
86f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
8700: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
8710: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
8720: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
8730: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
8740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8750: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
8760: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
8770: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8780: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
8790: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
87a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
87b0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
87c0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
87d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
87e0: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
87f0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
8800: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
8810: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
8820: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
8830: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
8840: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
8850: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
8860: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
8870: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
8880: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
8890: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
88a0: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
88b0: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
88c0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
88d0: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
88e0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
88f0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
8900: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
8910: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
8920: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
8930: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
8940: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
8950: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8960: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8970: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
8980: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8990: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
89a0: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
89b0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
89c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
89d0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
89e0: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
89f0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
8a00: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
8a10: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
8a20: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
8a30: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
8a40: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
8a50: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
8a60: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
8a70: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8a80: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
8a90: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
8aa0: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
8ab0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8ac0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
8ad0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
8ae0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
8af0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
8b00: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
8b10: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
8b20: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
8b30: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
8b40: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8b50: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8b60: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8b70: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8b80: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8b90: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8ba0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8bb0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8bc0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8bd0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8be0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8bf0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
8c00: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
8c10: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
8c20: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
8c30: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
8c40: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
8c50: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8c60: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8c70: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8c80: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8c90: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8ca0: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8cb0: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8cc0: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8cd0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8ce0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8cf0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
8d00: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
8d10: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
8d20: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
8d30: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
8d40: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
8d50: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
8d60: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
8d70: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
8d80: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
8d90: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
8da0: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8db0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8dc0: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8dd0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8de0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
8df0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
8e00: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
8e10: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
8e20: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
8e30: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
8e40: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
8e50: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
8e60: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
8e70: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
8e80: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
8e90: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
8ea0: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8eb0: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8ec0: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8ed0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8ee0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
8ef0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
8f00: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
8f10: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
8f20: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
8f30: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
8f40: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
8f50: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8f60: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
8f70: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
8f80: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
8f90: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
8fa0: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
8fb0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
8fc0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8fd0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8fe0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
8ff0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
9000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
9010: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
9020: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
9030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
9040: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
9050: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
9060: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
9070: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9080: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
9090: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
90a0: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
90b0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
90c0: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
90d0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
90e0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
90f0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
9100: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
9110: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
9120: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
9130: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
9140: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
9150: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
9160: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
9170: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
9180: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
9190: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
91a0: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
91b0: 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b   *jfd, int useCk
91c0: 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sum){.  int rc;.
91d0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
9200: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
9210: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9230: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
9240: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
9250: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
9260: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9280: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
9290: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
92a0: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
92b0: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
92c0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
92d0: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
92e0: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
92f0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
9300: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
9310: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
9320: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
9330: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
9340: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
9350: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
9360: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
9370: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
9380: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
9390: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
93a0: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
93b0: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
93c0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
93d0: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
93e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
93f0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
9400: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9410: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
9420: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9430: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
9440: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
9450: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
9460: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
9470: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
9480: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
9490: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
94a0: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
94b0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
94c0: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
94d0: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
94e0: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
94f0: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
9500: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9510: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
9520: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
9530: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
9540: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
9550: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
9560: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
9570: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
9580: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
9590: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
95a0: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
95b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
95c0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
95d0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
95e0: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
95f0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
9600: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
9610: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
9620: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
9630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9640: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
9650: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
9660: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
9670: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
9680: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9690: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
96a0: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
96b0: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
96c0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
96d0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
96e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
96f0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
9700: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9710: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
9720: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
9730: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9740: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
9750: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9760: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
9770: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
9780: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
9790: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
97a0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
97b0: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
97c0: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
97d0: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
97e0: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
97f0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
9800: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
9810: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
9820: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
9830: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
9840: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
9850: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9860: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
9870: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
9880: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
9890: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
98a0: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
98b0: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
98c0: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
98d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
98e0: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
98f0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
9900: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
9910: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
9920: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
9930: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
9940: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
9950: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
9960: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
9970: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
9980: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
9990: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
99a0: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
99b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
99c0: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
99d0: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
99e0: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
99f0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
9a00: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
9a10: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
9a20: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
9a30: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
9a40: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
9a50: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f  e in the main ro
9a60: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
9a70: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
9a80: 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42   if a full ROLLB
9a90: 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72  ACK occurs after
9aa0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
9ab0: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   ** rollback the
9ac0: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77   full ROLLBACK w
9ad0: 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20  ill not restore 
9ae0: 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20  the page to its 
9af0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f  original.  ** co
9b00: 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64  ntent.  Two cond
9b10: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
9b20: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
9b30: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
9b40: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31  e.  ** files. (1
9b50: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
9b60: 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20  ust be locked.  
9b70: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
9b80: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
9b90: 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ** page content 
9ba0: 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  is in the main j
9bb0: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
9bc0: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
9bd0: 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61  s not in.  ** ca
9be0: 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69  che or else it i
9bf0: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
9c00: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
9c10: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
9c20: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
9c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9c40: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
9c50: 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
9c60: 67 21 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g!=0 );.  PAGERT
9c70: 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20  RACE3("PLAYBACK 
9c80: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
9c90: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
9ca0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
9cb0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9cc0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
9cd0: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
9ce0: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
9cf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9d00: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
9d10: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
9d20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9d30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9d40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9d50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9d60: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
9d70: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9d80: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9d90: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  }.    if( pPg ){
9da0: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
9db0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
9dc0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
9dd0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
9de0: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
9df0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
9e00: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
9e10: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
9e20: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
9e30: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
9e40: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
9e50: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
9e60: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
9e70: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
9e80: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
9e90: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
9ea0: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
9eb0: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
9ec0: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
9ed0: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
9ee0: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
9ef0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
9f00: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
9f10: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
9f20: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
9f30: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
9f40: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
9f50: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
9f60: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
9f70: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
9f80: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
9f90: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9fa0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9fb0: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
9fc0: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
9fd0: 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72  iter(pPg, pPager
9fe0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9ff0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a000: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
a010: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
a020: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
a030: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
a040: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
a050: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
a060: 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 3);..    /* If
a070: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
a080: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
a090: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
a0a0: 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 2a  r.iChangeCount *
a0b0: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
a0c0: 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  1 ){.      pPage
a0d0: 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20  r->iChangeCount 
a0e0: 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
a0f0: 28 70 50 67 2c 20 32 34 29 3b 0a 20 20 20 20 7d  (pPg, 24);.    }
a100: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
a120: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
a130: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
a140: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a150: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
a160: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
a170: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
a180: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a190: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
a1a0: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
a1b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a1c0: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
a1d0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
a1e0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
a1f0: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
a200: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
a210: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
a220: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a230: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
a240: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
a250: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
a260: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
a270: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
a280: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
a290: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
a2a0: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
a2b0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
a2c0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
a2d0: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
a2e0: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
a2f0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
a300: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
a310: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
a320: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
a330: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a340: 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74  _delmaster(const
a350: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
a360: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
a370: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
a380: 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74  ;.  OsFile *mast
a390: 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
a3a0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
a3b0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
a3c0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
a3d0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
a3e0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
a3f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
a400: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a410: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
a420: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
a430: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
a440: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
a450: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
a460: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
a470: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
a480: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
a490: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
a4a0: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
a4b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
a4c0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d  sOpenReadOnly(zM
a4d0: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b  aster, &master);
a4e0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
a4f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 61 73 74  QLITE_OK || mast
a500: 65 72 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er );.  if( rc!=
a510: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a520: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a530: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
a540: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
a550: 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74  3OsFileSize(mast
a560: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
a570: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
a580: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a590: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a5a0: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
a5b0: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
a5c0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
a5d0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
a5e0: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
a5f0: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
a600: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a610: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
a620: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
a630: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
a640: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
a650: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
a660: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
a670: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
a680: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
a690: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
a6a0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
a6b0: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
a6c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
a6d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
a6e0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a6f0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
a700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a710: 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73  ead(master, zMas
a720: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
a730: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a740: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a750: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
a760: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
a770: 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
a780: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
a790: 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
a7a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
a7b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
a7c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a7d0: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a  3OsFileExists(zJ
a7e0: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
a7f0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
a800: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
a810: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
a820: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
a830: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
a840: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
a850: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
a860: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a870: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
a880: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
a890: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
a8a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a8b0: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
a8c0: 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65  /.        OsFile
a8d0: 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20   *journal = 0;. 
a8e0: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20         int c;.. 
a8f0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a900: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
a910: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
a920: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 61  rnal);.        a
a930: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a940: 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72 6e 61 6c 20  E_OK || journal 
a950: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
a960: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a970: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
a980: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a990: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
a9a0: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
a9b0: 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c  Journal(journal,
a9c0: 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20   &zMasterPtr);. 
a9d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
a9e0: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
a9f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
aa00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
aa10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
aa20: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
aa30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
aa40: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30   = zMasterPtr!=0
aa50: 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
aa60: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
aa70: 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  =0;.        sqli
aa80: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74  teFree(zMasterPt
aa90: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
aaa0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
aab0: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
aac0: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
aad0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
aae0: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
aaf0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
ab00: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
ab10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ab20: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
ab30: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
ab40: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
ab50: 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
ab60: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
ab70: 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
ab80: 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
ab90: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
aba0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
abb0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
abc0: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
abd0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
abe0: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
abf0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ac00: 72 63 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a  rc;.}..#if 0./*.
ac10: 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61  ** Make every pa
ac20: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
ac30: 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74 20  agree with what 
ac40: 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20  is on disk.  In 
ac50: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20  other words,.** 
ac60: 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b 20  reread the disk 
ac70: 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
ac80: 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e  te of the cache.
ac90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
aca0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
acb0: 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ter a rollback i
acc0: 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20  n which some of 
acd0: 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65 0a  the dirty cache.
ace0: 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65 76  ** pages had nev
acf0: 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
ad00: 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65  out to disk.  We
ad10: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61   need to roll ba
ad20: 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20  ck the.** cache 
ad30: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
ad40: 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 64  easiest way to d
ad50: 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65 72  o that is to rer
ad60: 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74  ead the old cont
ad70: 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d  ent.** back from
ad80: 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74   the disk..*/.st
ad90: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72  atic int pager_r
ada0: 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65  eload_cache(Page
adb0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
adc0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
add0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ade0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
adf0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
ae00: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
ae10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20  .    char *zBuf 
ae20: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
ae30: 61 63 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ace;        /* T
ae40: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
ae50: 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  one page */.    
ae60: 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20  if( !pPg->dirty 
ae70: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
ae80: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
ae90: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
aea0: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
aeb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
aec0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
aed0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
aee0: 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e  e*(i64)(pPg->pgn
aef0: 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28  o-1));.      if(
af00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
af10: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
af20: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
af30: 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
af40: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
af50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
af60: 50 41 47 45 52 54 52 41 43 45 33 28 22 52 45 46  PAGERTRACE3("REF
af70: 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
af80: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
af90: 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
afa0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
afb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44  break;.      COD
afc0: 45 43 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66  EC1(pPager, zBuf
afd0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b  , pPg->pgno, 2);
afe0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
aff0: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
b000: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
b010: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
b020: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
b030: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  || memcmp(zBuf, 
b040: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
b050: 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
b060: 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d  Size) ){.      m
b070: 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
b080: 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20  ATA(pPg), zBuf, 
b090: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b0a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
b0b0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
b0c0: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
b0d0: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c  ->xReiniter(pPg,
b0e0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b0f0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
b100: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
b110: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
b120: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
b130: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
b140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b150: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
b160: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
b170: 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
b180: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
b190: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
b1a0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
b1b0: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
b1c0: 64 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  dif.  }.  pPager
b1d0: 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
b1e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
b1f0: 64 69 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  dif..static void
b200: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
b210: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
b220: 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ger);../*.** Tru
b230: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
b240: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
b250: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
b260: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
b270: 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f   indicated. Also
b280: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
b290: 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  ched representat
b2a0: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ion of the file.
b2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b2c0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
b2d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b2e0: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
b2f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b300: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b310: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
b320: 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
b330: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
b340: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
b350: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
b360: 69 36 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  i64)nPage);.  }.
b370: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b380: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
b390: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
b3a0: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
b3b0: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
b3c0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
b3d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
b3e0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
b3f0: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
b400: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
b410: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
b420: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
b430: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
b440: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
b450: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
b460: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
b470: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
b480: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
b490: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
b4a0: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
b4b0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
b4c0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
b4d0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
b4e0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b4f0: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
b500: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
b510: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
b520: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
b530: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
b540: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
b550: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
b560: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
b570: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
b580: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
b590: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
b5a0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b5b0: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
b5c0: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
b5d0: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
b5e0: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
b5f0: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
b600: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
b610: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
b620: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
b630: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
b640: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
b650: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
b660: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b670: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b680: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
b690: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
b6a0: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
b6b0: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
b6c0: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
b6d0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
b6e0: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
b6f0: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
b700: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
b710: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b720: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
b730: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
b740: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
b750: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
b760: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
b770: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
b780: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
b790: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
b7a0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
b7b0: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
b7c0: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
b7d0: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
b7e0: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
b7f0: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
b800: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
b810: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
b820: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
b830: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
b840: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
b850: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
b860: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
b870: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b880: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
b890: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
b8a0: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
b8b0: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
b8c0: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
b8d0: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
b8e0: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
b8f0: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
b900: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
b910: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
b920: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
b930: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
b940: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
b950: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
b960: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
b970: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b980: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
b990: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
b9a0: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
b9b0: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
b9c0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
b9d0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
b9e0: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
b9f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
ba00: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
ba10: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
ba20: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
ba30: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
ba40: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
ba50: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
ba60: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
ba70: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
ba80: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
ba90: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
baa0: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
bab0: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
bac0: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
bad0: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
bae0: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
baf0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
bb00: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
bb10: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
bb20: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
bb30: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
bb40: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
bb50: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
bb60: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
bb70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
bb80: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
bb90: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
bba0: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
bbb0: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
bbc0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
bbd0: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
bbe0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
bbf0: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
bc00: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
bc10: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
bc20: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
bc30: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
bc40: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
bc50: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
bc60: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
bc70: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
bc80: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
bc90: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
bca0: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
bcb0: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
bcc0: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
bcd0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
bce0: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
bcf0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
bd00: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
bd10: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
bd20: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
bd30: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
bd40: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
bd50: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
bd60: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
bd70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
bd80: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
bd90: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
bda0: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
bdb0: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
bdc0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
bdd0: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
bde0: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
bdf0: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
be00: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
be10: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
be20: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
be30: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
be40: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
be50: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
be60: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
be70: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
be80: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
be90: 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
bea0: 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bec0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
bed0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
bee0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
bef0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bf00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
bf10: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
bf20: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
bf30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bf50: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
bf60: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
bf70: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
bf80: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
bf90: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
bfa0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
bfb0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
bfc0: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
bfd0: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
bfe0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
bff0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
c000: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c010: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
c020: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
c030: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
c040: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
c050: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
c060: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
c070: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
c080: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c090: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
c0a0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
c0b0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
c0c0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
c0d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c0e0: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
c0f0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
c100: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
c110: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
c120: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
c130: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
c140: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
c150: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
c160: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c170: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
c180: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
c190: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
c1a0: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
c1b0: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
c1c0: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
c1d0: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
c1e0: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
c1f0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
c200: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
c210: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  l(pPager->jfd, &
c220: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
c230: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
c240: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
c250: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
c260: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
c270: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
c280: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
c290: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
c2a0: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
c2b0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
c2c0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
c2d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c2e0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
c2f0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c  yback;.  }.  sql
c300: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
c310: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50  r->jfd, 0);.  pP
c320: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c330: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
c340: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
c350: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
c360: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
c370: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
c380: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
c390: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
c3a0: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
c3b0: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
c3c0: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
c3d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
c3e0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c3f0: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
c400: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
c410: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
c420: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
c430: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
c440: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
c450: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
c460: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
c470: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
c480: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
c490: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
c4a0: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
c4b0: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
c4c0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
c4d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
c4e0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
c4f0: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
c500: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
c510: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c520: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
c530: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
c540: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c550: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
c560: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
c570: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
c580: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
c590: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
c5a0: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
c5b0: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
c5c0: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
c5d0: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
c5e0: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
c5f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
c600: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
c610: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
c620: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
c630: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
c640: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
c650: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
c660: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
c670: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
c680: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
c690: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c6a0: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
c6b0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c6c0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c6d0: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
c6e0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
c6f0: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
c700: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
c710: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
c720: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c730: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c740: 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
c750: 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
c760: 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
c770: 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
c780: 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
c790: 73 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ss. In this case
c7a0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
c7b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
c7c0: 6e 73 69 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a  nsists of.    **
c7d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69   journalled copi
c7e0: 65 73 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  es of pages that
c7f0: 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 61 64   need to be read
c800: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 63   back into the c
c810: 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
c820: 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
c830: 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20  !isHot ){.      
c840: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
c850: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c860: 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
c870: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
c880: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
c890: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
c8a0: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
c8b0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
c8c0: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
c8d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
c8e0: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
c8f0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
c900: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c910: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
c920: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c930: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
c940: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
c950: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
c960: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c970: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c980: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
c990: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
c9a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
c9b0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
c9c0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
c9d0: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c9e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c9f0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
ca00: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
ca10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
ca20: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
ca30: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
ca40: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
ca50: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
ca60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ca70: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
ca80: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
ca90: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
caa0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
cab0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cac0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
cad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
cae0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
caf0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
cb00: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
cb10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cb20: 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
cb30: 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
cb40: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
cb50: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
cb60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
cb70: 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
cb80: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
cb90: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
cba0: 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
cbb0: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
cbc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
cbd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
cbe0: 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
cbf0: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
cc00: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
cc10: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
cc20: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
cc30: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
cc40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cc50: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
cc60: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
cc70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
cc80: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
cc90: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
cca0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
ccb0: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
ccc0: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
ccd0: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
cce0: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
ccf0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
cd00: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
cd10: 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
cd20: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
cd30: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
cd40: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
cd50: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
cd60: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63  */.  pPager->sec
cd70: 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
cd80: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
cd90: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 72 65 74  ager->fd);.  ret
cda0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cdb0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74   Playback the st
cdc0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
cdd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
cde0: 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e  imilar to playin
cdf0: 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  g back the trans
ce00: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
ce10: 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77  ut with.** a few
ce20: 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a   extra twists..*
ce30: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
ce40: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ce50: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
ce60: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61   file at the sta
ce70: 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  rt of.**        
ce80: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
ce90: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
cea0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f  er->stmtSize, no
ceb0: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
cec0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
ced0: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
cee0: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
cef0: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
cf00: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
cf10: 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a   journal, also.*
cf20: 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61  *         playba
cf30: 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20  ck all pages of 
cf40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
cf50: 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e  journal beginnin
cf60: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20  g.**         at 
cf70: 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73  offset pPager->s
cf80: 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  tmtJSize..*/.sta
cf90: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74  tic int pager_st
cfa0: 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  mt_playback(Page
cfb0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
cfc0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
cfd0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
cfe0: 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e  f the full journ
cff0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f  al */.  i64 hdrO
d000: 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20  ff;.  int nRec; 
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d020: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
d030: 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rds */.  int i; 
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
d060: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  r */.  int rc;..
d070: 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
d080: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e  journalOff;.#ifn
d090: 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a  def NDEBUG .  {.
d0a0: 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a      i64 os_szJ;.
d0b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d0c0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
d0d0: 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29  r->jfd, &os_szJ)
d0e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d0f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
d100: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
d110: 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a   szJ==os_szJ );.
d120: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
d130: 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
d140: 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73  e the offset jus
d150: 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  t after the end 
d160: 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  of the last jour
d170: 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72  nal.  ** page wr
d180: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65  itten before the
d190: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
d1a0: 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73  eader for this s
d1b0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
d1c0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72  ansaction was wr
d1d0: 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e  itten, or the en
d1e0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
d1f0: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
d200: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
d210: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
d220: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
d230: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
d240: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
d250: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
d260: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
d270: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
d280: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
d290: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
d2a0: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
d2b0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
d2c0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
d2d0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
d2e0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
d2f0: 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
d300: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
d310: 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
d320: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
d330: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
d340: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
d350: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
d360: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d370: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
d380: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
d390: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71  rnalOpen );.  sq
d3a0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
d3b0: 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
d3c0: 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
d3d0: 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
d3e0: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
d3f0: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
d400: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d410: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
d420: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d430: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
d440: 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
d450: 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
d460: 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
d470: 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
d480: 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
d490: 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
d4a0: 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
d4b0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
d4c0: 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
d4d0: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
d4e0: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
d4f0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d500: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d510: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
d520: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
d530: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
d540: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
d550: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d560: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d570: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
d580: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
d590: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
d5a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
d5b0: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
d5c0: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
d5d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
d5e0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
d5f0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
d600: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
d610: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
d620: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
d630: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
d640: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
d650: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d660: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
d670: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
d680: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
d690: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
d6a0: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
d6b0: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
d6c0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
d6d0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
d6e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
d6f0: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
d700: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
d710: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
d720: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
d730: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
d740: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
d750: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
d770: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d780: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
d790: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d7a0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
d7b0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73  e;.  pPager->cks
d7c0: 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d  umInit = pPager-
d7d0: 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68  >stmtCksum;.  wh
d7e0: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
d7f0: 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66  rnalOff < hdrOff
d800: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
d810: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
d820: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
d830: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
d840: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d850: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d860: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d870: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
d880: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
d890: 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
d8a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d8b0: 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
d8c0: 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
d8d0: 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
d8e0: 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
d8f0: 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
d900: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
d910: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
d920: 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
d930: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d940: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d950: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d960: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d970: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
d980: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
d990: 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
d9a0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
d9b0: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
d9c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
d9d0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
d9e0: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
d9f0: 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
da00: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
da10: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
da20: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
da30: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
da40: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
da50: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
da60: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
da70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
da80: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
da90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
daa0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
dab0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  back;.    }.  }.
dac0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
dad0: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a  alOff = szJ;.  .
dae0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
daf0: 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  k:.  if( rc==SQL
db00: 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50  ITE_OK) {.    pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
db20: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70   = szJ;.    /* p
db30: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
db40: 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  e(pPager); */.  
db50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
db60: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
db70: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
db80: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
db90: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
dba0: 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
dbb0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
dbc0: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
dbd0: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
dbe0: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
dbf0: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
dc00: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
dc10: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
dc20: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
dc30: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
dc40: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
dc50: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
dc60: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
dc70: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
dc80: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
dc90: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
dca0: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
dcb0: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
dcc0: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
dcd0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
dce0: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
dcf0: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
dd00: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
dd10: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
dd20: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
dd30: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
dd40: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
dd50: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
dd60: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
dd70: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
dd80: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
dd90: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
dda0: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
ddb0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
ddc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ddd0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
dde0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
ddf0: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
de00: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
de10: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
de20: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
de30: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
de40: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
de50: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
de60: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
de70: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
de80: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
de90: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
dea0: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
deb0: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
dec0: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
ded0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
dee0: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
def0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
df00: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
df10: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
df20: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
df30: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
df40: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
df50: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
df60: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
df70: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
df80: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
df90: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
dfa0: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
dfb0: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
dfc0: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
dfd0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
dff0: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
e000: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
e010: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
e020: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
e030: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
e040: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
e050: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
e060: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
e070: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
e080: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
e090: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
e0a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e0b0: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
e0c0: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
e0d0: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
e0e0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
e0f0: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
e100: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
e110: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
e120: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
e130: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
e140: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
e150: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
e160: 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
e170: 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
e180: 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
e190: 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
e1a0: 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b  int full_fsync){
e1b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
e1c0: 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c  c =  level==1 ||
e1d0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
e1e0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
e1f0: 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33  lSync = level==3
e200: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
e210: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
e220: 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75  >full_fsync = fu
e230: 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20  ll_fsync;.  if( 
e240: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
e250: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
e260: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
e270: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
e280: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
e290: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
e2a0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
e2b0: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
e2c0: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
e2d0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
e2e0: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
e2f0: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
e300: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
e310: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
e320: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
e330: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
e340: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
e350: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
e360: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
e370: 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  y file. .**.** W
e380: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
e390: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
e3a0: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
e3b0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
e3c0: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
e3d0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
e3e0: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
e3f0: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
e400: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
e410: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
e420: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
e430: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
e440: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  c int sqlite3Pag
e450: 65 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c  erOpentemp(OsFil
e460: 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  e **pFd){.  int 
e470: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
e480: 63 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b  c;.  char zFile[
e490: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
e4a0: 53 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53  SIZE];..#ifdef S
e4b0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
e4c0: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
e4d0: 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
e4e0: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
e4f0: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
e500: 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20  .#endif.  do{.  
e510: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
e520: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
e530: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
e540: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e550: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
e560: 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61  , pFd, 1);.    a
e570: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e580: 45 5f 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a  E_OK || *pFd );.
e590: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
e5a0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
e5b0: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
e5c0: 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e  OMEM );.  return
e5d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
e5e0: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
e5f0: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
e600: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
e610: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
e620: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
e630: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
e640: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
e650: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
e660: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
e670: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
e680: 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
e690: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
e6a0: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
e6b0: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
e6c0: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
e6d0: 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
e6e0: 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Unref()..**.** I
e6f0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
e700: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
e710: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
e720: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
e730: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
e740: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
e750: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
e760: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
e770: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
e780: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
e790: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
e7a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
e7b0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
e7c0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
e7d0: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
e7e0: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
e7f0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
e800: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
e810: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
e820: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
e830: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
e840: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e850: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
e860: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
e870: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
e880: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
e890: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e8a0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
e8b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
e8c0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
e8d0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
e8e0: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
e8f0: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
e900: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
e910: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
e920: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
e930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
e940: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
e950: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
e960: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e970: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
e980: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
e990: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20  .  int nameLen; 
e9a0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20   /* Compiler is 
e9b0: 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61  wrong. This is a
e9c0: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
e9d0: 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a  d before use */.
e9e0: 20 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30    OsFile *fd = 0
e9f0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ea00: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
ea10: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
ea20: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
ea30: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
ea40: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
ea50: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
ea60: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
ea70: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
ea80: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
ea90: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
eaa0: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
eab0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
eac0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
ead0: 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ZE];.#ifdef SQLI
eae0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
eaf0: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
eb00: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
eb10: 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
eb20: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
eb30: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
eb40: 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
eb50: 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
eb60: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
eb70: 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
eb80: 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
eb90: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
eba0: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
ebb0: 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
ebc0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
ebd0: 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
ebe0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
ebf0: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
ec00: 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75  n be set. It wou
ec10: 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73  ld be nice to as
ec20: 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54  sert.  ** that T
ec30: 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
ec40: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75   is non-zero, bu
ec50: 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61  t alas this brea
ec60: 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20  ks test cases . 
ec70: 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69   ** written to i
ec80: 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20  nvoke the pager 
ec90: 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  directly..  */. 
eca0: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
ecb0: 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
ecc0: 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
ecd0: 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69  t( pTsd );.#endi
ece0: 66 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20  f..  /* We used 
ecf0: 74 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f  to test if mallo
ed00: 63 28 29 20 68 61 64 20 61 6c 72 65 61 64 79 20  c() had already 
ed10: 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72  failed before pr
ed20: 6f 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20  oceeding. .  ** 
ed30: 42 75 74 20 74 68 65 20 77 61 79 20 74 68 69 73  But the way this
ed40: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
ed50: 64 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e  d in SQLite mean
ed60: 73 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72  s that can never
ed70: 0a 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75  .  ** happen. Fu
ed80: 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68  rthermore, if th
ed90: 65 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  e malloc-failed 
eda0: 66 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79 20  flag is already 
edb0: 73 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65  set, .  ** eithe
edc0: 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
edd0: 6c 69 74 65 53 74 72 44 75 70 28 29 20 6f 72 20  liteStrDup() or 
ede0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62  sqliteMalloc() b
edf0: 65 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66  elow will.  ** f
ee00: 61 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20  ail shortly and 
ee10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74  SQLITE_NOMEM ret
ee20: 75 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20  urned anyway..  
ee30: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
ee40: 30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  0;..  /* Open th
ee50: 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64  e pager file and
ee60: 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61   set zFullPathna
ee70: 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d  me to point at m
ee80: 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20  alloc()ed .  ** 
ee90: 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  memory containin
eea0: 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66  g the complete f
eeb0: 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e  ilename (i.e. in
eec0: 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65  cluding the dire
eed0: 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69  ctory)..  */.  i
eee0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
eef0: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
ef00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef10: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
ef20: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
ef30: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
ef40: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
ef50: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
ef60: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ef70: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
ef80: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
ef90: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46  f.    {.      zF
efa0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
efb0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
efc0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
efd0: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50        if( zFullP
efe0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
eff0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f000: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
f010: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
f020: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
f030: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
f040: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
f050: 66 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  fd );.      }.  
f060: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
f070: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
f080: 65 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b  erOpentemp(&fd);
f090: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
f0a0: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70  mpFileName(zTemp
f0b0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
f0c0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
f0d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
f0e0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
f0f0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
f100: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f110: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74  TE_OK ){.      t
f120: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
f130: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
f140: 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20  ocate the Pager 
f150: 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61  structure. As pa
f160: 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61  rt of the same a
f170: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63  llocation, alloc
f180: 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66  ate.  ** space f
f190: 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  or the full path
f1a0: 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64  s of the file, d
f1b0: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75  irectory and jou
f1c0: 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65  rnal .  ** (Page
f1d0: 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67  r.zFilename, Pag
f1e0: 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e  er.zDirectory an
f1f0: 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
f200: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  )..  */.  if( zF
f210: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
f220: 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72     nameLen = str
f230: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
f240: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
f250: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
f260: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
f270: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
f280: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
f290: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
f2a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
f2b0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
f2c0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
f2d0: 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44  llocRaw(SQLITE_D
f2e0: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
f2f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
f300: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
f310: 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
f320: 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
f330: 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
f340: 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69  memory .  ** poi
f350: 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c  nted to by zFull
f360: 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74  Pathname, free t
f370: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
f380: 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
f390: 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e   .  ** file. Sin
f3a0: 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
f3b0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
f3c0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
f3d0: 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
f3e0: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
f3f0: 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
f400: 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
f410: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c  zFullPathname ||
f420: 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
f430: 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ace || rc!=SQLIT
f440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
f450: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
f460: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f470: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f480: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
f490: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
f4a0: 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f  rn ((rc==SQLITE_
f4b0: 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  OK)?SQLITE_NOMEM
f4c0: 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  :rc);.  }..  PAG
f4d0: 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25  ERTRACE3("OPEN %
f4e0: 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
f4f0: 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c  DLEID(fd), zFull
f500: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54  Pathname);.  IOT
f510: 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
f520: 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46  s\n", pPager, zF
f530: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20  ullPathname)).  
f540: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
f550: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67  e = (char*)&pPag
f560: 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  er[1];.  pPager-
f570: 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
f580: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f590: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70  [nameLen+1];.  p
f5a0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
f5b0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
f5c0: 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ctory[nameLen+1]
f5d0: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
f5e0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46  r->zFilename, zF
f5f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f600: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
f610: 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c  Directory, zFull
f620: 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f  Pathname);..  fo
f630: 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30  r(i=nameLen; i>0
f640: 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
f650: 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
f660: 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
f670: 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
f680: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
f690: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
f6a0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75  r->zJournal, zFu
f6b0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
f6c0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
f6d0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
f6e0: 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
f6f0: 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22  rnal[nameLen], "
f700: 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50  -journal");.  pP
f710: 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  ager->fd = fd;. 
f720: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   /* pPager->jour
f730: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  nalOpen = 0; */.
f740: 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
f750: 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
f760: 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
f770: 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
f780: 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26  k = noReadlock &
f790: 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  & readOnly;.  /*
f7a0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
f7b0: 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
f7c0: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
f7d0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f7e0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
f7f0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
f800: 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
f810: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f820: 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
f830: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
f840: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
f850: 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
f860: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
f870: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f880: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
f890: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f8a0: 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b  r->nMaxPage = 0;
f8b0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
f8c0: 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73  Page = 100;.  as
f8d0: 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f  sert( PAGER_UNLO
f8e0: 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50  CK==0 );.  /* pP
f8f0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
f900: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20  GER_UNLOCK; */. 
f910: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
f920: 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
f930: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
f940: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73   tempFile;.  ass
f950: 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
f960: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
f970: 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
f980: 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
f990: 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
f9a0: 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
f9b0: 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
f9c0: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
f9d0: 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
f9e0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
f9f0: 64 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a  de = tempFile; .
fa00: 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
fa10: 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  = memDb;.  pPage
fa20: 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65  r->readOnly = re
fa30: 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
fa40: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
fa50: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
fa60: 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
fa70: 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73  >tempFile || !us
fa80: 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
fa90: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
faa0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30  pPager->noSync?0
fab0: 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  :1);.  /* pPager
fac0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
fad0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
fae0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
faf0: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
fb00: 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
fb10: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
fb20: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
fb30: 28 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65  (nExtra);.  asse
fb40: 72 74 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20  rt(fd||memDb);. 
fb50: 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
fb60: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
fb70: 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
fb80: 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b  sSectorSize(fd);
fb90: 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
fba0: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
fbb0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73   0; */.  /* mems
fbc0: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
fbd0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
fbe0: 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
fbf0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
fc00: 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ger;.#ifdef SQLI
fc10: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
fc20: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50  _MANAGEMENT.  pP
fc30: 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ager->pNext = pT
fc40: 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54  sd->pPager;.  pT
fc50: 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
fc60: 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ger;.#endif.  re
fc70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fc80: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
fc90: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
fca0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
fcb0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
fcc0: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
fcd0: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
fce0: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
fcf0: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
fd00: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
fd10: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
fd20: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
fd30: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
fd40: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
fd50: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
fd60: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
fd70: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
fd80: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
fd90: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
fda0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
fdb0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
fdc0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
fdd0: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
fde0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
fdf0: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
fe00: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
fe10: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
fe20: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
fe30: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
fe40: 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a  PagerClose().  .
fe50: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
fe60: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
fe70: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  y sqlite3PagerUn
fe80: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
fe90: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
fea0: 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a  structor(Pager *
feb0: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
fec0: 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e  Desc)(DbPage*,in
fed0: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
fee0: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
fef0: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
ff00: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
ff10: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
ff20: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
ff30: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
ff40: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
ff50: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
ff60: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
ff70: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
ff80: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
ff90: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
ffa0: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
ffb0: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
ffc0: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
ffd0: 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
ffe0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
fff0: 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
10000 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
10010 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
10020 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
10030 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10040 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
10050 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
10060 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
10070 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
10080 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
10090 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
100a0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
100b0 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75  page size.  Retu
100c0 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e  rn the new size.
100d0 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74    If the suggest
100e0 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a   new page.** siz
100f0 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61  e is inappropria
10100 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
10110 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
10120 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a  e is selected.**
10130 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a   and returned..*
10140 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
10150 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
10160 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
10170 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73   pageSize){.  as
10180 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d  sert( pageSize>=
10190 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
101a0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
101b0 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21  _SIZE );.  if( !
101c0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
101d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
101e0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
101f0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
10200 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10210 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
10220 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
10230 61 63 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61  ace = sqlite3Rea
10240 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65  llocOrFree(pPage
10250 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61  r->pTmpSpace, pa
10260 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72  geSize);.  }.  r
10270 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61  eturn pPager->pa
10280 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
10290 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
102a0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
102b0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
102c0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
102d0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
102e0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
102f0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
10300 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
10310 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
10320 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
10330 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
10340 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
10350 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
10360 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
10370 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
10380 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
10390 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
103a0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
103b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
103c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
103d0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
103e0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
103f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
10400 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
10410 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
10420 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
10430 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
10440 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
10450 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
10460 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
10470 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10480 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
10490 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
104a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
104b0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
104c0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
104d0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
104e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
104f0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
10500 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
10510 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
10520 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10530 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
10540 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
10550 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
10560 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
10570 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
10580 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
10590 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
105a0 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
105b0 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
105c0 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
105d0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
105e0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
105f0 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
10600 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
10610 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
10620 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
10630 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
10640 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
10650 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
10660 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
10670 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
10680 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
10690 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
106a0 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
106b0 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
106c0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
106d0 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
106e0 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
106f0 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
10700 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
10710 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
10720 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
10730 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
10740 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
10750 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
10760 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10770 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
10780 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
10790 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
107a0 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  {.    disable_si
107b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
107c0 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
107d0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
107e0 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c  d, 0);.    enabl
107f0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10800 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54  rrors();.    IOT
10810 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
10820 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
10830 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
10840 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
10850 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
10860 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
10870 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
10880 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
10890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
108a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
108b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
108c0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
108d0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
108e0 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
108f0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10900 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
10910 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
10920 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
10930 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
10940 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
10950 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
10960 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
10970 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
10980 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
10990 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
109a0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
109b0 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
109c0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
109d0 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
109e0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
109f0 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
10a00 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
10a10 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
10a20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
10a30 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
10a40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
10a50 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  n;.  int rc;.  a
10a60 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
10a70 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
10a80 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
10a90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
10aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
10ab0 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
10ac0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
10ad0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
10ae0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
10af0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10b00 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
10b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10b20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
10b30 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
10b40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10b50 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
10b60 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
10b70 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
10b80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
10b90 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
10ba0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
10bb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
10bc0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
10bd0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
10be0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
10bf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10c00 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
10c10 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
10c20 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
10c30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
10c40 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
10c50 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
10c60 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  B./*.** Clear a 
10c70 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
10c80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10c90 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
10ca0 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
10cb0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
10cc0 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
10cd0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
10ce0 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
10cf0 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
10d00 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
10d10 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
10d20 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
10d30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
10d40 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
10d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
10d60 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
10d70 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  *);../*.** Unlin
10d80 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
10d90 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
10da0 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
10db0 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
10dc0 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
10dd0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
10de0 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
10df0 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
10e00 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
10e10 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
10e20 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75  erMovepage() rou
10e30 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61  tine can leave a
10e40 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
10e50 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76   pNextFree/pPrev
10e60 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69  Free list that i
10e70 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20  s not a part of 
10e80 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a  any hash-chain..
10e90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
10ea0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50  nlinkHashChain(P
10eb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
10ec0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
10ed0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
10ee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
10ef0 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
10f00 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
10f10 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
10f20 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  n;.  }.  if( pPg
10f30 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
10f40 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
10f50 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
10f60 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
10f70 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
10f80 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61  revHash ){.    a
10f90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
10fa0 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26  Hash[pPg->pgno &
10fb0 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
10fc0 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20  1)]!=pPg );.    
10fd0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
10fe0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
10ff0 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
11000 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
11010 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50   pPg->pgno & (pP
11020 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
11030 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
11040 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
11050 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  tHash;.  }.  if(
11060 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c   MEMDB ){.    cl
11070 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
11080 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
11090 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50  ager));.  }.  pP
110a0 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70  g->pgno = 0;.  p
110b0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
110c0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
110d0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   0;.}../*.** Unl
110e0 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ink a page from 
110f0 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74  the free list (t
11100 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
11110 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
11120 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20  =0).** and from 
11130 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69  its hash collisi
11140 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  on chain..*/.sta
11150 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50  tic void unlinkP
11160 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
11170 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
11180 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
11190 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70  .  /* Keep the p
111a0 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e  FirstSynced poin
111b0 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ter pointing at 
111c0 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72  the first synchr
111d0 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20  onized page */. 
111e0 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
111f0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
11200 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
11210 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11220 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26  .    while( p &&
11230 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
11240 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
11250 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ; }.    pPager->
11260 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
11270 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
11280 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  nk from the free
11290 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50  list */.  if( pP
112a0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
112b0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
112c0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
112d0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
112e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
112f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
11300 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
11310 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
11320 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11330 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
11340 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
11350 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
11360 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
11370 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
11380 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
11390 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d  ( pPager->pLast=
113a0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
113b0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
113c0 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a  >pPrevFree;.  }.
113d0 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
113e0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
113f0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  e = 0;..  /* Unl
11400 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e  ink from the pgn
11410 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  o hash table */.
11420 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
11430 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
11440 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
11450 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
11460 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
11470 63 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62  che when a datab
11480 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61  ase.** is trunca
11490 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20  ted.  Drop from 
114a0 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61  the cache all pa
114b0 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
114c0 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e  s.** larger than
114d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
114e0 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
114f0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ced..**.** Refer
11500 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
11510 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
11520 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
11530 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c  d..**.** Actuall
11540 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  y, at the point 
11550 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11560 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64  called, it would
11570 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   be.** an error 
11580 74 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65  to have a refere
11590 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20  nced page.  But 
115a0 72 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65  rather than dele
115b0 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  te.** that page 
115c0 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20  and guarantee a 
115d0 73 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61  subsequent segfa
115e0 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65  ult, it seems be
115f0 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20  tter.** to zero 
11600 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74  it and hope that
11610 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61   we error out sa
11620 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nely..*/.static 
11630 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
11640 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
11650 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
11660 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20  r *pPg;.  PgHdr 
11670 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62  **ppPg;.  int db
11680 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
11690 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d  bSize;..  ppPg =
116a0 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a   &pPager->pAll;.
116b0 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20    while( (pPg = 
116c0 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20  *ppPg)!=0 ){.   
116d0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
116e0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
116f0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
11700 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
11710 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30   if( pPg->nRef>0
11720 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
11730 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
11740 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
11750 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
11760 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
11770 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
11780 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d  e{.      *ppPg =
11790 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
117a0 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
117b0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
117c0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
117d0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
117e0 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
117f0 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
11800 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
11810 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
11820 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
11830 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
11840 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
11850 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
11860 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
11870 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  e.  Repeat until
11880 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11890 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
118a0 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
118b0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
118c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
118d0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
118e0 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
118f0 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
11900 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
11910 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
11920 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
11930 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
11940 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
11950 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
11960 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
11970 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
11980 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
11990 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
119a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
119b0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
119c0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
119d0 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
119e0 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
119f0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
11a00 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
11a10 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
11a20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11a30 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
11a40 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
11a50 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
11a60 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73   unknown */.  as
11a70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11a80 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11a90 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
11aa0 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29  ize<0 || MEMDB )
11ab0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
11ac0 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
11ad0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11ae0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
11af0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11b00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
11b10 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
11b20 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
11b30 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
11b40 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
11b50 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
11b60 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
11b70 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
11b80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11b90 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
11ba0 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
11bb0 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
11bc0 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
11bd0 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
11be0 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
11bf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11c00 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
11c10 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
11c20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
11c30 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
11c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
11c50 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
11c60 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
11c70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
11c80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11c90 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11ca0 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20  D || MEMDB );.  
11cb0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11cc0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
11cd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
11ce0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
11cf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11d00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
11d10 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
11d20 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
11d30 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
11d40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11d50 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  OK;.  }.  if( ME
11d60 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
11d70 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
11d80 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
11d90 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
11da0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
11db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11dc0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
11dd0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
11de0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11df0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11e00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
11e10 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11e20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
11e30 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
11e40 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
11e50 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11e60 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
11e70 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
11e80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11e90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11ea0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
11eb0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
11ec0 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
11ed0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11ee0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
11ef0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
11f00 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
11f10 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
11f20 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
11f30 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
11f40 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
11f50 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11f60 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
11f70 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
11f80 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
11f90 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
11fa0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
11fb0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
11fc0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
11fd0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
11fe0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
11ff0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
12000 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
12010 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12020 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
12030 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
12040 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
12050 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12060 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
12070 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
12080 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
12090 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
120a0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
120b0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
120c0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
120d0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
120e0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
120f0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
12100 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
12110 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
12120 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
12130 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
12140 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
12150 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
12160 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12170 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
12180 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
12190 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
121a0 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
121b0 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
121c0 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
121d0 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
121e0 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
121f0 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
12200 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
12210 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
12220 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
12230 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
12240 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
12250 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
12260 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
12270 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
12280 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
12290 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  t..  */.  Thread
122a0 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
122b0 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
122c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
122d0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
122e0 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41  pTsd && pTsd->nA
122f0 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  lloc );.#endif..
12300 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
12310 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
12320 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
12330 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
12340 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12350 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
12360 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
12370 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
12380 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
12390 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
123a0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
123b0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
123c0 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
123d0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
123e0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
123f0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
12400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12410 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
12420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
12430 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
12440 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
12450 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
12460 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
12470 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
12480 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
12490 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
124a0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
124b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
124c0 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
124d0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
124e0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
124f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
12500 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
12510 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
12520 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
12530 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
12540 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
12550 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12560 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
12570 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
12580 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
12590 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64   ** }.  */..#ifd
125a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
125b0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
125c0 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  NT.  /* Remove t
125d0 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68  he pager from th
125e0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
125f0 20 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67   pagers starting
12600 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64   at .  ** Thread
12610 44 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d  Data.pPager if m
12620 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
12630 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a   is enabled..  *
12640 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  /.  if( pPager==
12650 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a  pTsd->pPager ){.
12660 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72      pTsd->pPager
12670 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
12680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
12690 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  ager *pTmp;.    
126a0 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d  for(pTmp = pTsd-
126b0 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70  >pPager; pTmp->p
126c0 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54  Next!=pPager; pT
126d0 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b  mp=pTmp->pNext){
126e0 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78  }.    pTmp->pNex
126f0 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
12700 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
12710 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
12720 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  r->aHash);.  sql
12730 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
12740 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
12750 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
12760 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12770 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
12780 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
12790 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
127a0 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
127b0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
127c0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
127d0 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
127e0 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  rn p->pgno;.}../
127f0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65  *.** The page_re
12800 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63  f() function inc
12810 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65  rements the refe
12820 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
12830 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68  a page..** If th
12840 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
12850 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
12860 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e  ist (the referen
12870 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
12880 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65  ) then.** remove
12890 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65   it from the fre
128a0 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elist..**.** For
128b0 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d   non-test system
128c0 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73  s, page_ref() is
128d0 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61   a macro that ca
128e0 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a  lls _page_ref().
128f0 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65  ** online of the
12900 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
12910 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74   is zero.  For t
12920 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
12930 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20  e_ref().** is a 
12940 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f  real function so
12950 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74   that we can set
12960 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64   breakpoints and
12970 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74   trace it..*/.st
12980 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f  atic void _page_
12990 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
129a0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
129b0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
129c0 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
129d0 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
129e0 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e  ist.  Remove it.
129f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d   */.    if( pPg=
12a00 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46  =pPg->pPager->pF
12a10 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
12a20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
12a30 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12a40 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26       while( p &&
12a50 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
12a60 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
12a70 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  ; }.      pPg->p
12a80 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12a90 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ced = p;.    }. 
12aa0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
12ab0 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
12ac0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
12ad0 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
12ae0 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
12af0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12b00 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  >pPager->pFirst 
12b10 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12b30 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
12b40 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  {.      pPg->pNe
12b50 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
12b60 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
12b70 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
12b80 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
12b90 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
12ba0 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a  PrevFree;.    }.
12bb0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
12bc0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
12bd0 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45  Pg->nRef++;.  RE
12be0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69  FINFO(pPg);.}.#i
12bf0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
12c00 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
12c10 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
12c20 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50  pPg){.    if( pP
12c30 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
12c40 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50      _page_ref(pP
12c50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
12c60 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b       pPg->nRef++
12c70 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28  ;.      REFINFO(
12c80 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
12c90 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
12ca0 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
12cb0 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
12cc0 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
12cd0 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
12ce0 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
12cf0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
12d00 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
12d10 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
12d20 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
12d30 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
12d40 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
12d50 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
12d60 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
12d70 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
12d80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12d90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
12da0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
12db0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
12dc0 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
12dd0 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
12de0 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
12df0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
12e00 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
12e10 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
12e20 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
12e30 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
12e40 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
12e50 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
12e60 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
12e70 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
12e80 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
12e90 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
12ea0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
12eb0 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
12ec0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
12ed0 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
12ee0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
12ef0 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
12f00 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
12f10 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
12f20 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
12f30 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
12f40 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
12f50 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
12f60 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
12f70 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
12f80 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
12f90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
12fa0 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
12fb0 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
12fc0 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
12fd0 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
12fe0 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
12ff0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
13000 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
13010 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
13020 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
13030 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
13040 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
13050 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
13060 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
13070 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
13080 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
13090 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
130a0 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
130b0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
130c0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
130d0 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
130e0 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
130f0 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
13100 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
13110 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
13120 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
13130 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13140 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
13150 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
13160 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
13170 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
13180 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
13190 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
131a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
131b0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
131c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
131d0 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  ;..  /* Sync the
131e0 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
131f0 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61  modifying the ma
13200 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  in database.  **
13210 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65   (assuming there
13220 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e   is a journal an
13230 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  d it needs to be
13240 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20   synced.).  */. 
13250 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
13260 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28  dSync ){.    if(
13270 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
13280 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  le ){.      asse
13290 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
132a0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
132b0 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
132c0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
132d0 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
132e0 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
132f0 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
13300 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
13310 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
13320 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
13330 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
13340 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
13350 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
13360 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
13370 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
13380 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
13390 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
133a0 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
133b0 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
133c0 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
133d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
133e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
133f0 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20     i64 jSz;.    
13400 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13410 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
13420 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20  r->jfd, &jSz);. 
13430 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
13440 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
13450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13460 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13470 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d  ==jSz );.      }
13480 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
13490 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
134a0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
134b0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
134c0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
134d0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
134e0 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
134f0 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
13500 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
13510 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
13520 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
13530 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
13540 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
13550 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
13560 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
13570 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
13580 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
13590 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a  back. .        *
135a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
135b0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
135c0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
135d0 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
135e0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
135f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
13600 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
13610 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
13620 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
13630 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13640 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
13650 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13660 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
13670 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13680 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
13690 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
136a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20  pPager->jfd,.   
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
136d0 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
136e0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
136f0 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c));.        if(
13700 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13710 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
13720 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
13730 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20  %d\n", pPager,. 
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13760 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
13770 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29  urnalMagic), 4))
13780 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
13790 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
137a0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
137b0 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
137c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
137d0 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
137e0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
137f0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13800 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
13810 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
13820 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13830 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54    }.      PAGERT
13840 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
13850 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
13860 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
13870 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
13880 4a 53 59 4e 43 20 25 64 5c 6e 22 2c 20 70 50 61  JSYNC %d\n", pPa
13890 67 65 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d  ger)).      rc =
138a0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
138b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
138c0 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
138d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
138e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
138f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13900 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
13910 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
13920 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
13930 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
13940 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
13950 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
13960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
13970 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
13980 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
13990 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
139a0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
139b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
139c0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
139d0 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
139e0 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
139f0 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
13a00 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
13a10 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
13a20 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
13a30 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
13a40 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
13a50 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
13a60 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
13a70 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
13a80 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
13a90 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
13aa0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
13ab0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
13ac0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
13ad0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13ae0 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
13af0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13b00 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
13b10 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
13b20 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
13b30 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
13b40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
13b50 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
13b60 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
13b70 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69   by pDirty and i
13b80 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a  n pgno order..**
13b90 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78   Do not both fix
13ba0 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72  ing the pPrevDir
13bb0 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  ty pointers..*/.
13bc0 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65  static PgHdr *me
13bd0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  rge_pagelist(PgH
13be0 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70  dr *pA, PgHdr *p
13bf0 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75  B){.  PgHdr resu
13c00 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54  lt, *pTail;.  pT
13c10 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20  ail = &result;. 
13c20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42   while( pA && pB
13c30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
13c40 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b  pgno<pB->pgno ){
13c50 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
13c60 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20  irty = pA;.     
13c70 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20   pTail = pA;.   
13c80 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72     pA = pA->pDir
13c90 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
13ca0 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
13cb0 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  ty = pB;.      p
13cc0 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20  Tail = pB;.     
13cd0 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79   pB = pB->pDirty
13ce0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13cf0 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pA ){.    pTai
13d00 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
13d10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29    }else if( pB )
13d20 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
13d30 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73  rty = pB;.  }els
13d40 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  e{.    pTail->pD
13d50 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
13d60 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44  return result.pD
13d70 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  irty;.}../*.** S
13d80 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ort the list of 
13d90 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
13da0 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f  ng order by pgno
13db0 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20  .  Pages are.** 
13dc0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
13dd0 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54  rty pointers.  T
13de0 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
13df0 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f  inters are.** co
13e00 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20  rrupted by this 
13e10 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  sort..*/.#define
13e20 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41   N_SORT_BUCKET_A
13e30 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20  LLOC 25.#define 
13e40 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20  N_SORT_BUCKET   
13e50 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51      25.#ifdef SQ
13e60 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
13e70 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
13e80 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b  sort_bucket = 0;
13e90 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54  .  #undef N_SORT
13ea0 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e  _BUCKET.  #defin
13eb0 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
13ec0 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61  \.   (sqlite3_pa
13ed0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
13ee0 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t?sqlite3_pager_
13ef0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f  n_sort_bucket:N_
13f00 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
13f10 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  C).#endif.static
13f20 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67   PgHdr *sort_pag
13f30 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e  elist(PgHdr *pIn
13f40 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f  ){.  PgHdr *a[N_
13f50 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
13f60 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  C], *p;.  int i;
13f70 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20  .  memset(a, 0, 
13f80 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68  sizeof(a));.  wh
13f90 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20  ile( pIn ){.    
13fa0 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e  p = pIn;.    pIn
13fb0 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
13fc0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
13fd0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13fe0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b  N_SORT_BUCKET-1;
13ff0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
14000 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
14010 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
14020 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14040 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
14050 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
14060 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b         a[i] = 0;
14070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14080 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54     if( i==N_SORT
14090 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20  _BUCKET-1 ){.   
140a0 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20     /* Coverage: 
140b0 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65  To get here, the
140c0 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e  re need to be 2^
140d0 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20  (N_SORT_BUCKET) 
140e0 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
140f0 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ts in the input 
14100 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f  list. This is po
14110 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72  ssible, but impr
14120 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a  actical..      *
14130 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c  * Testing this l
14140 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74  ine is the point
14150 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   of global varia
14160 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  ble.      ** sql
14170 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
14180 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20  t_bucket..      
14190 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  */.      a[i] = 
141a0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61  merge_pagelist(a
141b0 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  [i], p);.    }. 
141c0 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20   }.  p = a[0];. 
141d0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f   for(i=1; i<N_SO
141e0 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b  RT_BUCKET; i++){
141f0 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70  .    p = merge_p
14200 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29  agelist(p, a[i])
14210 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
14220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
14230 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
14240 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
14250 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
14260 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
14270 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
14280 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
14290 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
142a0 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
142b0 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
142c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
142d0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
142e0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
142f0 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
14300 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
14310 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14320 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14330 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
14340 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
14350 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
14360 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
14370 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
14380 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
14390 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
143a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
143b0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
143c0 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
143d0 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
143e0 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
143f0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
14400 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
14410 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
14420 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
14430 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
14440 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
14450 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
14460 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
14470 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
14480 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
14490 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
144a0 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
144b0 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
144c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
144d0 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
144e0 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
144f0 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
14500 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
14510 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
14520 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
14530 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
14540 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
14550 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
14560 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
14570 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
14580 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
14590 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
145a0 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
145b0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
145c0 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
145d0 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
145e0 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
145f0 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
14600 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
14610 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
14620 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
14630 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
14640 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
14650 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
14660 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
14670 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
14680 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
14690 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
146a0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
146b0 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
146c0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
146d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
146e0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
146f0 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
14700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14710 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
14720 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70    pList = sort_p
14730 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a  agelist(pList);.
14740 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
14750 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
14760 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  ist->dirty );.  
14770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14780 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
14790 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
147a0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
147b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
147c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
147d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
147e0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
147f0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
14800 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
14810 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
14820 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
14830 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
14840 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
14850 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
14860 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
14870 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
14880 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
14890 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
148a0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
148b0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
148c0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
148d0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
148e0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
148f0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
14900 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
14910 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
14920 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
14930 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
14940 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
14950 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
14960 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
14970 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
14980 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
14990 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  no);.      IOTRA
149a0 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
149b0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69  \n", pPager, pLi
149c0 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  st->pgno)).     
149d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
149e0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
149f0 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
14a00 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14a10 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
14a20 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
14a30 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
14a40 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
14a50 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f   PAGERTRACE3("NO
14a60 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
14a70 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
14a80 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
14a90 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  o);.    }.#endif
14aa0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
14ab0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69  turn rc;.    pLi
14ac0 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  st->dirty = 0;.#
14ad0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
14ae0 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69  CK_PAGES.    pLi
14af0 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  st->pageHash = p
14b00 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
14b10 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ist);.#endif.   
14b20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
14b30 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
14b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14b50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
14b60 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
14b70 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
14b80 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
14b90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
14ba0 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
14bb0 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
14bc0 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
14bd0 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
14be0 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
14bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
14c00 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
14c10 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
14c20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
14c30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69  turn pPager->pDi
14c40 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
14c50 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
14c60 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
14c70 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
14c80 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
14c90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
14ca0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
14cb0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
14cc0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
14cd0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
14ce0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
14cf0 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
14d00 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
14d10 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
14d20 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
14d30 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
14d40 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
14d50 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
14d60 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
14d70 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
14d80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
14d90 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
14da0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14db0 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  f( !pPager->useJ
14dc0 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20  ournal ) return 
14dd0 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
14de0 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
14df0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
14e00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14e10 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
14e20 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
14e30 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
14e40 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14e50 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
14e60 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
14e70 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  nt(pPager)==0 ){
14e80 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
14e90 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
14ea0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75  urnal);.    retu
14eb0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
14ec0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
14ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
14ee0 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
14ef0 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63  the cache that c
14f00 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20  an be recycled. 
14f10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14f20 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ine may return S
14f30 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
14f40 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49  ITE_FULL or SQLI
14f50 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f  TE_OK. It .** do
14f60 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70  es not set the p
14f70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76  Pager->errCode v
14f80 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
14f90 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63  ic int pager_rec
14fa0 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  ycle(Pager *pPag
14fb0 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20  er, int syncOk, 
14fc0 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20  PgHdr **ppPg){. 
14fd0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a   PgHdr *pPg;.  *
14fe0 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73  ppPg = 0;..  ass
14ff0 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a 0a 20 20  ert(!MEMDB);..  
15000 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
15010 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
15020 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
15030 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
15040 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
15050 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
15060 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
15070 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61    */.  pPg = pPa
15080 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
15090 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
150a0 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
150b0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
150c0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
150d0 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
150e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
150f0 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
15100 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
15110 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
15120 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
15130 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
15140 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
15150 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
15160 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
15170 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
15180 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
15190 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e  r->pFirst && syn
151a0 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
151b0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
151c0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
151d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
151e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
151f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
15200 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
15210 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  nc ){.      /* I
15220 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
15230 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
15240 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15250 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
15260 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
15270 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
15280 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
15290 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
152a0 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
152b0 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
152c0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
152d0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
152e0 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
152f0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
15300 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15310 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
15320 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
15330 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
15340 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
15350 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
15360 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
15370 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
15380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15390 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
153a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
153b0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
153c0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  nc==0 );.      r
153d0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
153e0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
153f0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
15400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15410 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
15420 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65  .    pPg = pPage
15430 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20  r->pFirst;.  }. 
15440 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
15450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15460 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
15470 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
15480 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
15490 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
154a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
154b0 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
154c0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  */.  if( pPg->di
154d0 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  rty ){.    int r
154e0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
154f0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
15500 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
15510 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
15520 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
15530 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
15540 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
15550 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
15560 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pg );.    if( rc
15570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15580 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15590 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
155a0 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
155b0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
155c0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
155d0 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
155e0 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
155f0 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
15600 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
15610 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
15620 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
15630 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
15640 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
15650 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
15660 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
15670 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
15680 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
15690 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
156a0 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
156b0 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
156c0 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
156d0 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
156e0 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
156f0 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
15700 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
15710 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
15720 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
15730 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
15740 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
15750 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
15760 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
15770 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
15780 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
15790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
157a0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
157b0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
157c0 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43  ("ALWAYS_ROLLBAC
157d0 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
157e0 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  ).    pPager->al
157f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
15800 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
15810 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
15820 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
15830 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
15840 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
15850 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
15860 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
15870 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67  o==0 );..  *ppPg
15880 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
15890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
158a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
158b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
158c0 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
158d0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
158e0 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
158f0 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
15900 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
15910 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
15920 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
15930 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
15940 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
15950 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46 72 65  may be sqliteFre
15960 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65  e()ed..**.** nRe
15970 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  q is the number 
15980 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
15990 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63  ry required. Onc
159a0 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a  e this much has.
159b0 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ** been released
159c0 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
159d0 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69  eturns. A negati
159e0 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65  ve value for nRe
159f0 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20  q means.** free 
15a00 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
15a10 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20  s possible. The 
15a20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
15a30 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
15a40 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
15a50 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
15a60 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
15a70 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
15a80 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20  _MANAGEMENT.int 
15a90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65  sqlite3PagerRele
15aa0 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  aseMemory(int nR
15ab0 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
15ac0 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
15ad0 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
15ae0 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
15af0 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
15b00 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
15b10 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c  /* If the the gl
15b20 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65  obal mutex is he
15b30 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  ld, this subrout
15b40 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20  ine becomes a.  
15b50 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79  ** o-op; zero by
15b60 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72  tes of memory ar
15b70 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69  e freed.  This i
15b80 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73  s because.  ** s
15b90 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20  ome of the code 
15ba0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20  invoked by this 
15bb0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73  function may als
15bc0 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62  o.  ** try to ob
15bd0 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20  tain the mutex, 
15be0 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64  resulting in a d
15bf0 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  eadlock..  */.  
15c00 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  if( sqlite3OsInM
15c10 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72  utex(0) ){.    r
15c20 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
15c30 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f  /* Outermost loo
15c40 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f  p runs for at mo
15c50 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e  st two iteration
15c60 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69  s. First iterati
15c70 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74  on we.  ** try t
15c80 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68  o find memory th
15c90 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  at can be releas
15ca0 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69  ed without calli
15cb0 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f  ng fsync(). Seco
15cc0 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f  nd.  ** iteratio
15cd0 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75  n (which only ru
15ce0 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ns if the first 
15cf0 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e  failed to free n
15d00 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a  Req bytes of.  *
15d10 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72  * memory) is per
15d20 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66  mitted to call f
15d30 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20  sync(). This is 
15d40 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d  of course much m
15d50 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73  ore .  ** expens
15d60 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
15d70 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b  i=0; i<=1; i++){
15d80 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
15d90 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51  rough all the SQ
15da0 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e  Lite pagers open
15db0 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
15dc0 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  t thread. */.   
15dd0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
15de0 20 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b   pTsdro->pPager;
15df0 0a 20 20 20 20 66 6f 72 28 20 3b 20 70 50 61 67  .    for( ; pPag
15e00 65 72 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c  er && (nReq<0 ||
15e10 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
15e20 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d  ; pPager=pPager-
15e30 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50  >pNext){.      P
15e40 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
15e50 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
15e60 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
15e70 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15e80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15e90 20 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c   For each pager,
15ea0 20 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20   try to free as 
15eb0 6d 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f  many pages as po
15ec0 73 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20  ssible (without 
15ed0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e  .      ** callin
15ee0 67 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69  g fsync() if thi
15ef0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  s is the first i
15f00 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
15f10 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20  outermost .     
15f20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20   ** loop)..     
15f30 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
15f40 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
15f50 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
15f60 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29  pPager, i, &pPg)
15f70 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20  ) && pPg) {.    
15f80 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75      /* We've fou
15f90 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65  nd a page to fre
15fa0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
15fb0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
15fc0 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  en .        ** r
15fd0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
15fe0 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
15ff0 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
16000 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
16010 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79      ** (pFirstSy
16020 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69  nced). It is sti
16030 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61  ll in the all pa
16040 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e  ges (pAll) list.
16050 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d   .        ** Rem
16060 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73  ove it from this
16070 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65   list before fre
16080 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a  eing..        **
16090 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f  .        ** Todo
160a0 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65  : Check the Page
160b0 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20  r.pStmt list to 
160c0 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69  make sure this i
160d0 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20  s Ok. It .      
160e0 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73    ** probably is
160f0 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20   though..       
16100 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64   */.        PgHd
16110 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20  r *pTmp;.       
16120 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
16130 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d          if( pPg=
16140 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b  =pPager->pAll ){
16150 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67  .           pPag
16160 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e  er->pAll = pPg->
16170 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
16180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16190 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61     for( pTmp=pPa
161a0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d  ger->pAll; pTmp-
161b0 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20  >pNextAll!=pPg; 
161c0 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74  pTmp=pTmp->pNext
161d0 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20  All ){}.        
161e0 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c    pTmp->pNextAll
161f0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
16200 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16210 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d      nReleased +=
16220 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65   sqliteAllocSize
16230 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73  (pPg);.        s
16240 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
16250 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
16260 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16270 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
16280 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
16290 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
162a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
162b0 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20  ile or .        
162c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61  ** journal in pa
162d0 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54  ger_recycle(). T
162e0 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  he error is not 
162f0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
16300 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  .        ** call
16310 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  er of this funct
16320 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65  ion. Instead, se
16330 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43  t the Pager.errC
16340 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  ode variable..  
16350 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72        ** The err
16360 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  or will be retur
16370 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
16380 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68  (or users, in th
16390 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 20 20  e case .        
163a0 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70  ** of a shared p
163b0 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74  ager cache) of t
163c0 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69  he pager for whi
163d0 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  ch the error occ
163e0 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ured..        */
163f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16400 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49   (rc&0xff)==SQLI
16410 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d  TE_IOERR || rc==
16420 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20  SQLITE_FULL );. 
16430 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16440 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
16450 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
16460 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72          pager_er
16470 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16490 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65   }..  return nRe
164a0 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  leased;.}.#endif
164b0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
164c0 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
164d0 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ENT */../*.** Re
164e0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
164f0 66 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  f page pPg out o
16500 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
16510 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
16520 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 61  nt readDbPage(Pa
16530 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
16540 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  dr *pPg, Pgno pg
16550 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
16560 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
16570 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
16580 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
16590 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
165a0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
165b0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Size);.  if( rc=
165c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
165d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
165e0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
165f0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16600 50 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Pg),.           
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16620 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16630 3b 0a 20 20 7d 0a 20 20 49 4f 54 52 41 43 45 28  ;.  }.  IOTRACE(
16640 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
16650 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a   pPager, pgno)).
16660 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 46    PAGERTRACE3("F
16670 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
16680 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
16690 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
166a0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
166b0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
166c0 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  pPg), pPg->pgno,
166d0 20 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   3);.  return rc
166e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
166f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
16700 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  led to obtain th
16710 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65  e shared lock re
16720 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a  quired before.**
16730 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61   data may be rea
16740 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
16750 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73   cache. If the s
16760 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61  hared lock has a
16770 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
16780 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75  btained, this fu
16790 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
167a0 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  p..**.** Immedia
167b0 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
167c0 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ning the shared 
167d0 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65  lock (if require
167e0 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  d), this functio
167f0 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20  n.** checks for 
16800 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
16810 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  le. If one is fo
16820 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63  und, an emergenc
16830 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  y rollback.** is
16840 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64   performed immed
16850 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
16860 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
16870 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
16880 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
16890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
168a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
168b0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
168c0 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
168d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
168e0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
168f0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
16900 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
16910 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
16920 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
16930 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
16940 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
16950 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16970 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
16980 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
16990 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
169a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
169b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
169c0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
169d0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
169e0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
169f0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
16a00 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
16a10 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
16a20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16a30 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
16a40 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
16a50 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
16a60 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
16a70 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48  /.      if( hasH
16a80 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
16a90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16aa0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
16ab0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16ac0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
16ad0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
16ae0 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72          ** impor
16af0 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
16b00 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
16b10 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
16b20 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
16b30 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
16b40 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
16b50 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
16b60 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
16b70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
16b80 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
16b90 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
16ba0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
16bb0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
16bc0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16bd0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
16be0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
16bf0 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
16c00 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20  ing it .        
16c10 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
16c20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   ** .        ** 
16c30 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
16c40 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
16c50 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
16c60 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
16c70 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
16c80 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
16c90 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
16ca0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
16cb0 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  il to.        **
16cc0 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
16cd0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16ce0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16cf0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
16d00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16d10 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
16d20 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
16d30 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
16d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16d50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16d60 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
16d70 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
16d80 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16d90 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16db0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16dc0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
16dd0 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  E;. .        /* 
16de0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
16df0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
16e00 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
16e10 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
16e20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
16e30 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
16e40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
16e50 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
16e60 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
16e70 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
16e80 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
16e90 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
16ea0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
16eb0 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
16ec0 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
16ed0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
16ee0 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a   holds.        *
16ef0 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
16f00 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
16f10 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
16f20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
16f30 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
16f40 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
16f50 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
16f60 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a   time..        *
16f70 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  *..** Open the j
16f80 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
16f90 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
16fa0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
16fb0 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d   ..** exclusive-
16fc0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
16fd0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16fe0 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
16ff0 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
17000 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
17010 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
17020 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
17030 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
17040 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
17050 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
17060 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
17070 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
17080 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
17090 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
170a0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
170b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
170c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
170d0 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  Y;.        if( s
170e0 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
170f0 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
17100 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
17110 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20    int ro;.      
17120 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
17130 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
17140 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17150 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
17160 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a  dWrite(pPager->z
17170 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
17180 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20  ->jfd, &ro);.   
17190 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
171a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
171b0 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20  pPager->jfd );. 
171c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 20           if( ro 
171d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
171e0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
171f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
17200 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
17210 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
17220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
17230 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17250 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
17260 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
17270 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17280 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
17290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
172a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
172b0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
172c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
172d0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
172e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
172f0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
17300 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
17310 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
17320 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17330 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
17340 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
17350 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
17360 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
17370 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
17380 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
17390 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
173a0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
173b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
173c0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
173d0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
173e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
173f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
17410 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
17420 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
17430 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
17440 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
17450 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
17460 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
17470 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
17480 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
17490 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
174a0 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
174b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
174c0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
174d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
174e0 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
174f0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
17500 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
17510 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
17520 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
17530 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
17540 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
17550 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
17560 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
17570 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
17580 6e 29 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65  n). If the value
17590 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
175a0 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 2a  ounter.        *
175b0 2a 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  * stored in Page
175c0 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 6d  r.iChangeCount m
175d0 61 74 63 68 65 73 20 74 68 61 74 20 66 6f 75 6e  atches that foun
175e0 64 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 0a 20  d on page 1 of. 
175f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
17600 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
17610 6e 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68  n no database ch
17620 61 6e 67 65 73 20 68 61 76 65 20 6f 63 63 75 72  anges have occur
17630 65 64 20 73 69 6e 63 65 0a 20 20 20 20 20 20 20  ed since.       
17640 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 61   ** the cache wa
17650 73 20 6c 61 73 74 20 76 61 6c 69 64 20 61 6e 64  s last valid and
17660 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
17670 65 74 61 69 6e 20 74 68 65 20 63 61 63 68 65 64  etain the cached
17680 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
17690 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  s. Otherwise, if
176a0 20 50 61 67 65 72 2e 69 43 68 61 6e 67 65 43 6f   Pager.iChangeCo
176b0 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  unt does not mat
176c0 63 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ch the.        *
176d0 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  * change-counter
176e0 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68   on page 1 of th
176f0 65 20 66 69 6c 65 2c 20 74 68 65 20 63 75 72 72  e file, the curr
17700 65 6e 74 20 63 61 63 68 65 20 63 6f 6e 74 65 6e  ent cache conten
17710 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 75  ts.        ** mu
17720 73 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  st be discarded.
17730 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17740 20 20 20 20 75 38 20 7a 43 5b 34 5d 3b 0a 20 20      u8 zC[4];.  
17750 20 20 20 20 20 20 75 33 32 20 69 43 68 61 6e 67        u32 iChang
17760 65 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  eCounter = 0;.  
17770 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17780 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
17790 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  er);..        if
177a0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
177b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
177c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
177d0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d  rCode;.        }
177e0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
177f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
17800 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  {.          /* R
17810 65 61 64 20 74 68 65 20 34 2d 62 79 74 65 20 63  ead the 4-byte c
17820 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 64 69  hange counter di
17830 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
17840 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
17850 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17860 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
17870 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 24);.         
17880 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
178a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
178b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
178c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
178d0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
178e0 2c 20 7a 43 2c 20 34 29 3b 0a 20 20 20 20 20 20  , zC, 4);.      
178f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17910 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17920 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17930 20 20 20 20 20 20 69 43 68 61 6e 67 65 43 6f 75        iChangeCou
17940 6e 74 65 72 20 3d 20 28 7a 43 5b 30 5d 3c 3c 32  nter = (zC[0]<<2
17950 34 29 20 2b 20 28 7a 43 5b 31 5d 3c 3c 31 36 29  4) + (zC[1]<<16)
17960 20 2b 20 28 7a 43 5b 32 5d 3c 3c 38 29 20 2b 20   + (zC[2]<<8) + 
17970 7a 43 5b 33 5d 3b 0a 20 20 20 20 20 20 20 20 7d  zC[3];.        }
17980 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ..        if( iC
17990 68 61 6e 67 65 43 6f 75 6e 74 65 72 21 3d 70 50  hangeCounter!=pP
179a0 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75  ager->iChangeCou
179b0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
179c0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
179d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
179e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
179f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17a00 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
17a10 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  | pPager->state<
17a20 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
17a30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17a40 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
17a50 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
17a60 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
17a70 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
17a80 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
17a90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
17aa0 6f 63 61 74 65 20 61 20 50 67 48 64 72 20 6f 62  ocate a PgHdr ob
17ab0 6a 65 63 74 2e 20 20 20 45 69 74 68 65 72 20 63  ject.   Either c
17ac0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
17ad0 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65  or reuse.** an e
17ae0 78 69 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74  xisting one that
17af0 20 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73   is not otherwis
17b00 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  e in use..**.** 
17b10 41 20 6e 65 77 20 50 67 48 64 72 20 73 74 72 75  A new PgHdr stru
17b20 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
17b30 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
17b40 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20  ollowing are.** 
17b50 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
17b60 28 31 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74  (1)  We have not
17b70 20 65 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61   exceeded our ma
17b80 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20  ximum allocated 
17b90 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20  cache size.**   
17ba0 20 20 20 20 20 20 20 61 73 20 73 65 74 20 62 79         as set by
17bb0 20 74 68 65 20 22 50 52 41 47 4d 41 20 63 61 63   the "PRAGMA cac
17bc0 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64  he_size" command
17bd0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20  ..**.**     (2) 
17be0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e   There are no un
17bf0 75 73 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63  used PgHdr objec
17c00 74 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ts available at 
17c10 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  this time..**.**
17c20 20 20 20 20 20 28 33 29 20 20 54 68 69 73 20 69       (3)  This i
17c30 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
17c40 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
17c50 20 20 20 28 34 29 20 20 54 68 65 72 65 20 61 72     (4)  There ar
17c60 65 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63  e no PgHdr objec
17c70 74 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72  ts that do not r
17c80 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
17c90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c  .**          fil
17ca0 65 20 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e  e sync and a syn
17cb0 63 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  c of the journal
17cc0 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
17cd0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70  ly.**          p
17ce0 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  rohibited..**.**
17cf0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75 73   Otherwise, reus
17d00 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67  e an existing Pg
17d10 48 64 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  Hdr.  In other w
17d20 6f 72 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a  ords, reuse an.*
17d30 2a 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72  * existing PgHdr
17d40 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
17d50 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
17d60 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  e:.**.**     (1)
17d70 20 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65    We have reache
17d80 64 20 6f 72 20 65 78 63 65 65 64 65 64 20 74 68  d or exceeded th
17d90 65 20 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20  e maximum cache 
17da0 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
17db0 20 61 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41   allowed by "PRA
17dc0 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e  GMA cache_size".
17dd0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  .**.**     (2)  
17de0 54 68 65 72 65 20 69 73 20 61 20 50 67 48 64 72  There is a PgHdr
17df0 20 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20   available with 
17e00 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a  PgHdr->nRef==0.*
17e10 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65  *.**     (3)  We
17e20 20 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69   are not in an i
17e30 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
17e40 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  e.**.**     (4) 
17e50 20 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73   Either there is
17e60 20 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67   an available Pg
17e70 48 64 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  Hdr that does no
17e80 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20  t need.**       
17e90 20 20 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20     to be synced 
17ea0 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20  to disk or else 
17eb0 64 69 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20  disk syncing is 
17ec0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
17ed0 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a        allowed..*
17ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
17ef0 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50  erAllocatePage(P
17f00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
17f10 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69  Hdr **ppPg){.  i
17f20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17f30 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  K;.  PgHdr *pPg;
17f40 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20  ..  /* Create a 
17f50 6e 65 77 20 50 67 48 64 72 20 69 66 20 61 6e 79  new PgHdr if any
17f60 20 6f 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e   of the four con
17f70 64 69 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20  ditions defined 
17f80 0a 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 6d  .  ** above is m
17f90 65 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  et: */.  if( pPa
17fa0 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
17fb0 72 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20  r->mxPage.   || 
17fc0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
17fd0 30 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20  0 .   || MEMDB. 
17fe0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 70 46    || (pPager->pF
17ff0 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26  irstSynced==0 &&
18000 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
18010 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  nc).  ){.    if(
18020 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d   pPager->nPage>=
18030 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b  pPager->nHash ){
18040 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
18050 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70  ize_hash_table(p
18060 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20  Pager,.         
18070 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35  pPager->nHash<25
18080 36 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72  6 ? 256 : pPager
18090 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20  ->nHash*2);.    
180a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48    if( pPager->nH
180b0 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ash==0 ){.      
180c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
180d0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  MEM;.        got
180e0 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
180f0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18100 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 73 71    }.    pPg = sq
18110 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
18120 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
18130 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a             + siz
18160 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
18170 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->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 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
181a0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
181b0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  );.    if( pPg==
181c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
181d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
181e0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
181f0 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
18200 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
18210 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
18220 67 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  g));.    if( MEM
18230 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  DB ){.      mems
18240 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  et(PGHDR_TO_HIST
18250 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
18260 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  , sizeof(PgHisto
18270 72 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ry));.    }.    
18280 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
18290 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
182a0 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
182b0 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67  ->pAll;.    pPag
182c0 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
182d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
182e0 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e++;.    if( pPa
182f0 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65  ger->nPage>pPage
18300 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20  r->nMaxPage ){. 
18310 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
18320 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28  ger->nMaxPage==(
18330 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29  pPager->nPage-1)
18340 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
18350 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20  ->nMaxPage++;.  
18360 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18370 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65   /* Recycle an e
18380 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74  xisting page wit
18390 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75  h a zero ref-cou
183a0 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  nt. */.    rc = 
183b0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
183c0 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a  ager, 1, &pPg);.
183d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
183e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
183f0 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
18400 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
18410 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18420 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
18430 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
18440 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  rt(pPg);.  }.  *
18450 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67  ppPg = pPg;..pag
18460 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a  er_allocate_out:
18470 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18480 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
18490 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
184a0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
184b0 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
184c0 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
184d0 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
184e0 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
184f0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
18500 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
18510 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
18520 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65  sed..**.** A _ge
18530 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  t works for any 
18540 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
18550 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
18560 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
18570 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
18580 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
18590 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
185a0 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
185b0 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
185c0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
185d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
185e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
185f0 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
18600 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
18610 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
18620 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
18630 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
18640 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
18650 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
18660 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
18670 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
18680 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
18690 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
186a0 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
186b0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
186c0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
186d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
186e0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
186f0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
18700 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
18710 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
18720 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
18730 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61   and _lookup() a
18740 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
18750 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
18760 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
18770 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
18780 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
18790 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
187a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
187b0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
187c0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
187d0 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75   _lookup().** ju
187e0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
187f0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
18800 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
18810 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18820 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
18830 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
18840 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
18850 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
18860 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
18870 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29   Since _lookup()
18880 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
18890 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
188a0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
188b0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
188c0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
188d0 49 66 20 63 6c 72 46 6c 61 67 20 69 73 20 66 61  If clrFlag is fa
188e0 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
188f0 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
18900 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
18910 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66 46 6c 61  sk..** If clfFla
18920 67 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  g is true, it me
18930 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
18940 61 62 6f 75 74 20 74 6f 20 62 65 20 65 72 61 73  about to be eras
18950 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77 72 69 74  ed and.** rewrit
18960 74 65 6e 20 77 69 74 68 6f 75 74 20 66 69 72 73  ten without firs
18970 74 20 62 65 69 6e 67 20 72 65 61 64 20 73 6f 20  t being read so 
18980 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
18990 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a 20 74 68  t it doing.** th
189a0 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69  e disk I/O..*/.i
189b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
189c0 63 71 75 69 72 65 28 50 61 67 65 72 20 2a 70 50  cquire(Pager *pP
189d0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
189e0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
189f0 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67 29 7b 0a  , int clrFlag){.
18a00 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
18a10 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
18a20 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18a30 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
18a40 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
18a50 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
18a60 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
18a70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
18a80 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
18a90 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
18aa0 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
18ab0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
18ac0 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
18ad0 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
18ae0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
18af0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
18b00 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
18b10 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
18b20 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
18b30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18b40 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
18b50 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
18b60 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
18b70 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
18b80 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
18b90 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
18ba0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
18bb0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
18bc0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
18bd0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
18be0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
18bf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18c00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
18c10 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
18c20 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
18c30 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
18c40 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
18c50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18c60 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
18c70 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
18c80 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
18c90 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
18ca0 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
18cb0 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
18cc0 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
18cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18ce0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
18cf0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
18d00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18d10 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
18d20 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
18d30 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
18d40 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
18d50 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
18d60 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
18d70 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
18d80 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
18d90 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69   int nMax;.    i
18da0 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49  nt h;.    TEST_I
18db0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
18dc0 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  s);.    rc = pag
18dd0 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70  erAllocatePage(p
18de0 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20  Pager, &pPg);.  
18df0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
18e10 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
18e20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
18e30 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
18e40 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e   !MEMDB || pgno>
18e50 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
18e60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
18e70 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
18e80 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
18e90 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
18ea0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18eb0 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
18ec0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
18ed0 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
18ee0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
18ef0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
18f00 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
18f10 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
18f20 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
18f30 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
18f40 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
18f50 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
18f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18f70 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
18f80 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
18f90 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
18fa0 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61   }..    makeClea
18fb0 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
18fc0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
18fd0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
18fe0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
18ff0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
19000 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
19010 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
19020 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
19030 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
19040 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
19050 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c  }.    nMax = sql
19060 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19070 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
19080 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
19090 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
190a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
190b0 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg);.      rc = 
190c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
190d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
190e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
190f0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67  Populate the pag
19100 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74  e with data, eit
19110 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66  her by reading f
19120 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
19130 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72  .    ** file, or
19140 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
19150 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a  entire page to z
19160 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
19170 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67  if( nMax<(int)pg
19180 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28  no || MEMDB || (
19190 63 6c 72 46 6c 61 67 20 26 26 20 21 70 50 61 67  clrFlag && !pPag
191a0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
191b0 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ck) ){.      mem
191c0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
191d0 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
191e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
191f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19200 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
19210 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
19220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19230 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
19240 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
19250 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
19260 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
19270 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
19280 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
19290 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
192a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  rn rc;.      }el
192b0 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54  se{.        TEST
192c0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
192d0 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ead);.      }.  
192e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b    }..    /* Link
192f0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
19300 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62  he page hash tab
19310 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67  le */.    h = pg
19320 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
19330 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
19340 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
19350 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
19360 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
19370 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
19380 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
19390 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
193a0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
193b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
193c0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
193d0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
193e0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
193f0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
19400 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
19410 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
19420 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
19430 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
19440 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
19450 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
19460 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
19470 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
19480 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
19490 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
194a0 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d  >nRef>0 || pgno=
194b0 3d 31 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e  =1);.    TEST_IN
194c0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
194d0 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  ;.    page_ref(p
194e0 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
194f0 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  ge = pPg;.  retu
19500 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19510 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
19520 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
19530 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
19540 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
19550 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
19560 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
19570 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
19580 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
19590 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
195a0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
195b0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
195c0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
195d0 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
195e0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
195f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
19600 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
19610 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
19620 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
19630 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
19640 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
19650 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
19660 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
19670 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
19680 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
19690 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
196a0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
196b0 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
196c0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
196d0 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
196e0 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
196f0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
19700 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
19710 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
19720 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
19730 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
19740 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
19750 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19760 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
19770 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  NLOCK ){.    ass
19780 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41  ert( !pPager->pA
19790 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78  ll || pPager->ex
197a0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20  clusiveMode );. 
197b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
197c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
197d0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
197e0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
197f0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
19800 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50  turn 0;.  }.  pP
19810 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
19820 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
19830 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
19840 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
19850 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
19860 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
19870 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
19880 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
19890 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
198a0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
198b0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
198c0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
198d0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
198e0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
198f0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
19900 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
19910 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
19920 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
19930 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
19940 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
19950 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
19960 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19970 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
19980 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
19990 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
199a0 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
199b0 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
199c0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
199d0 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
199e0 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
199f0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
19a00 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
19a10 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
19a20 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
19a30 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
19a40 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
19a50 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
19a60 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
19a70 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
19a80 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
19a90 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
19aa0 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  r;.    pPager = 
19ab0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
19ac0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
19ad0 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  = 0;.    pPg->pP
19ae0 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72  revFree = pPager
19af0 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61  ->pLast;.    pPa
19b00 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
19b10 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
19b20 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
19b30 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
19b40 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
19b50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
19b60 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
19b70 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  st = pPg;.    }.
19b80 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
19b90 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67  dSync==0 && pPag
19ba0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
19bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
19bc0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
19bd0 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  d = pPg;.    }. 
19be0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
19bf0 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
19c00 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
19c10 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61  tructor(pPg, pPa
19c20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19c30 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
19c40 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
19c50 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
19c60 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
19c70 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
19c80 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
19c90 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
19ca0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
19cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19cc0 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
19cd0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
19ce0 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67  Ref==0 && (!pPag
19cf0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
19d00 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
19d10 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
19d20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
19d30 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
19d40 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
19d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
19d70 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
19d80 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
19d90 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
19da0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
19db0 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
19dc0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19dd0 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
19de0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19df0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
19e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
19e10 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
19e20 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
19e30 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
19e40 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
19e50 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
19e60 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
19e70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
19e80 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
19e90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
19ea0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
19eb0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
19ec0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19ed0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19ef0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
19f00 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
19f10 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
19f20 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
19f30 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
19f40 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
19f50 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19f60 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
19f70 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19f80 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
19f90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
19fa0 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
19fb0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19fc0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
19fd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
19fe0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
19ff0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1a000 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1a010 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
1a020 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
1a030 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
1a040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46     pPager->tempF
1a070 69 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ile);.  assert( 
1a080 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a090 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a   pPager->jfd );.
1a0a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a0b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
1a0c0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
1a0d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
1a0e0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69  rnalHdr = 0;.  i
1a0f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a100 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
1a110 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
1a120 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
1a130 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
1a140 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
1a150 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1a160 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1a170 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
1a180 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65  etFullSync(pPage
1a190 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1a1a0 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73  full_fsync);.  s
1a1b0 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53  qlite3OsSetFullS
1a1c0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
1a1d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
1a1e0 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
1a1f0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
1a200 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1a210 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a  r->zDirectory);.
1a220 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a230 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
1a240 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1a250 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
1a260 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1a270 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
1a280 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
1a290 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
1a2a0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
1a2b0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1a2c0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1a2d0 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
1a2e0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1a2f0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
1a300 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1a310 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1a320 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
1a330 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1a340 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1a350 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
1a360 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1a370 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a380 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
1a390 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
1a3a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a3b0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1a3c0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
1a3d0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1a3e0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
1a3f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1a400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
1a420 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
1a430 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65  eturn rc;..faile
1a440 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1a450 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  l:.  sqliteFree(
1a460 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a470 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  al);.  pPager->a
1a480 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
1a490 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a4a0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
1a4b0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
1a4c0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
1a4d0 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
1a4e0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
1a4f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1a500 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
1a510 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1a520 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1a530 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
1a540 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1a550 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
1a560 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1a570 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
1a580 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1a590 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1a5a0 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
1a5b0 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
1a5c0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
1a5d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1a5e0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
1a5f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1a600 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
1a610 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
1a620 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1a630 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
1a640 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
1a650 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
1a660 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
1a670 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
1a680 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1a690 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
1a6a0 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
1a6b0 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
1a6c0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
1a6d0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1a6e0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1a6f0 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
1a700 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
1a710 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
1a720 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
1a730 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
1a740 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
1a750 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
1a760 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
1a770 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
1a780 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
1a790 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
1a7a0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1a7b0 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
1a7c0 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
1a7d0 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
1a7e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
1a7f0 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
1a800 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
1a810 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
1a820 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1a830 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
1a840 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1a850 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
1a860 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
1a870 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1a880 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
1a890 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
1a8a0 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
1a8b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1a8c0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
1a8d0 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
1a8e0 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
1a8f0 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
1a900 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
1a910 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
1a920 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
1a930 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
1a940 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
1a950 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1a960 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
1a970 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
1a980 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a990 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1a9a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a9b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1a9c0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
1a9d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a9e0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1a9f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1aa00 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1aa10 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
1aa20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1aa30 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1aa40 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1aa50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1aa60 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
1aa70 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
1aa80 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1aa90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1aaa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1aab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1aac0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
1aad0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
1aae0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1aaf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ab00 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1ab10 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
1ab20 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
1ab30 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
1ab40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1ab50 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1ab60 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1ab70 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
1ab80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ab90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aba0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1abb0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1abc0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1abd0 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
1abe0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
1abf0 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
1ac00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1ac10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
1ac20 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1ac30 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
1ac40 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
1ac50 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
1ac60 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
1ac70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ac80 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
1ac90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1aca0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1acb0 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lOff==0 ){.    /
1acc0 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
1acd0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61  hen the pager wa
1ace0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  s in exclusive-a
1acf0 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a  ccess mode last.
1ad00 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72      ** time a (r
1ad10 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72  ead or write) tr
1ad20 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75  ansaction was su
1ad30 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c  ccessfully concl
1ad40 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  uded.    ** by t
1ad50 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  his connection. 
1ad60 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74  Instead of delet
1ad70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
1ad80 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20  file it was .   
1ad90 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   ** kept open an
1ada0 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  d truncated to 0
1adb0 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   bytes..    */. 
1adc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1add0 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
1ade0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1adf0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
1ae00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1ae10 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ae20 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  l==0 );.    sqli
1ae30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1ae40 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
1ae50 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ae60 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
1ae70 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1ae80 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  /8 + 1 );.    if
1ae90 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ( !pPager->aInJo
1aea0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1aeb0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1aec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aed0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
1aee0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1aef0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  dbSize;.      rc
1af00 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1af10 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1af20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1af30 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1af40 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
1af50 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
1af60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1af70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1af80 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
1af90 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20 69  ge dirty.  Set i
1afa0 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e  ts dirty flag an
1afb0 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  d add it to the 
1afc0 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69  dirty.** page li
1afd0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
1afe0 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48  id makeDirty(PgH
1aff0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
1b000 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b  pPg->dirty==0 ){
1b010 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
1b020 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1b030 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
1b040 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
1b050 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
1b060 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20  pDirty;.    if( 
1b070 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29  pPager->pDirty )
1b080 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1b090 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
1b0a0 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ty = pPg;.    }.
1b0b0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69      pPg->pPrevDi
1b0c0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
1b0d0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  ger->pDirty = pP
1b0e0 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  g;.  }.}../*.** 
1b0f0 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61  Make a page clea
1b100 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69  n.  Clear its di
1b110 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f  rty bit and remo
1b120 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a  ve it from the.*
1b130 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73  * dirty page lis
1b140 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1b150 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
1b160 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
1b170 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
1b180 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
1b190 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44  .    if( pPg->pD
1b1a0 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
1b1b0 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  g->pDirty->pPrev
1b1c0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72  Dirty = pPg->pPr
1b1d0 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  evDirty;.    }. 
1b1e0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
1b1f0 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  vDirty ){.      
1b200 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d  pPg->pPrevDirty-
1b210 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1b220 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
1b230 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
1b240 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50  ger->pDirty = pP
1b250 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
1b260 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  .  }.}.../*.** M
1b270 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
1b280 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
1b290 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
1b2a0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
1b2b0 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
1b2c0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1b2d0 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
1b2e0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
1b2f0 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
1b300 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
1b310 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1b320 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1b330 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1b340 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
1b350 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
1b360 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
1b370 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
1b380 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b390 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
1b3a0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
1b3b0 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
1b3c0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1b3d0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
1b3e0 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
1b3f0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
1b400 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
1b410 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
1b420 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
1b430 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
1b440 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
1b450 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1b460 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1b470 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
1b480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
1b490 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
1b4a0 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
1b4b0 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
1b4c0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1b4d0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
1b4e0 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
1b4f0 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
1b500 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
1b510 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
1b520 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
1b530 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
1b540 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
1b550 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1b560 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72  PagerCommit() or
1b570 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1b580 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
1b590 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1b5a0 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
1b5b0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
1b5c0 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44  id *pData = PGHD
1b5d0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
1b5e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1b5f0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1b600 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b610 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
1b620 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
1b630 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1b640 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72  rrCode ){ .    r
1b650 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1b660 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1b670 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1b680 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
1b690 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
1b6a0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
1b6b0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1b6c0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
1b6d0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
1b6e0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
1b6f0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
1b700 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1b710 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
1b720 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
1b730 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
1b740 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
1b750 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50  /.  makeDirty(pP
1b760 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  g);.  if( pPg->i
1b770 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67  nJournal && (pag
1b780 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67  eInStatement(pPg
1b790 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ) || pPager->stm
1b7a0 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
1b7b0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1b7c0 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
1b7d0 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
1b7e0 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
1b7f0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1b800 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
1b810 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
1b820 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
1b830 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
1b840 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
1b850 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
1b860 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
1b870 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
1b880 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
1b890 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1b8a0 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
1b8b0 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
1b8c0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1b8d0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b8e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1b8f0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1b900 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b910 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67  e3PagerBegin(pPg
1b920 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1b930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b940 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b950 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b960 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1b970 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1b980 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
1b990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1b9a0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
1b9b0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1b9c0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
1b9d0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1b9e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b9f0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1ba00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
1ba10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1ba20 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
1ba30 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1ba40 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
1ba50 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1ba60 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
1ba70 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1ba80 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
1ba90 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
1baa0 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
1bab0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1bac0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
1bad0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
1bae0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1baf0 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
1bb00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1bb10 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
1bb20 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1bb30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bb40 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1bb50 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
1bb60 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42  Journal || MEMDB
1bb70 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
1bb80 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
1bb90 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1bba0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
1bbb0 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  nt szPg;.       
1bbc0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1bbd0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1bbe0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1bbf0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1bc00 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
1bc10 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f   PAGERTRACE3("JO
1bc20 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1bc30 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1bc40 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1bc50 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
1bc60 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
1bc70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
1bc80 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
1bc90 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
1bca0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1bcb0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
1bcc0 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
1bcd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1bce0 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
1bcf0 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
1bd00 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1bd10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1bd20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1bd30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1bd40 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64  u32 cksum, saved
1bd50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
1bd60 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b   *pData2, *pEnd;
1bd70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
1bd80 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
1bd90 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
1bda0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
1bdb0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1bdc0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
1bdd0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
1bde0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
1bdf0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
1be00 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
1be10 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
1be20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1be30 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
1be40 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1be50 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
1be60 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1be70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1be80 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
1be90 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
1bea0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
1beb0 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
1bec0 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 64 20  .          pEnd 
1bed0 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61 67 65  = pData2 + pPage
1bee0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1bef0 20 20 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d         pData2 -=
1bf00 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61   4;.          sa
1bf10 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e  ved = *(u32*)pEn
1bf20 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  d;.          put
1bf30 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73  32bits(pEnd, cks
1bf40 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  um);.          s
1bf50 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  zPg = pPager->pa
1bf60 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20  geSize+8;.      
1bf70 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44      put32bits(pD
1bf80 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ata2, pPg->pgno)
1bf90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1bfa0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1bfb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
1bfc0 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20  ta2, szPg);.    
1bfd0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1bfe0 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
1bff0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1c000 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1c020 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c030 20 73 7a 50 67 29 29 0a 20 20 20 20 20 20 20 20   szPg)).        
1c040 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c050 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20  lOff += szPg;.  
1c060 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1c070 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE4("JOURNAL %d 
1c080 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1c090 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1c0a0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1c0b0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1c0c0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
1c0d0 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
1c0e0 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61  *(u32*)pEnd = sa
1c0f0 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65  ved;...  /* An e
1c100 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
1c110 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1c120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1c130 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
1c140 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
1c150 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1c160 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
1c170 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
1c180 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1c190 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1c1b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1c1c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50   }..          pP
1c1d0 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
1c1e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c1f0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1c200 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
1c210 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1c220 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
1c230 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1c240 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
1c250 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1c260 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
1c270 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
1c280 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1c290 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
1c2a0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1c2b0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1c2c0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1c2d0 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  7);.          }.
1c2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c2f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c300 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
1c310 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1c320 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
1c330 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
1c340 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1c350 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1c360 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1c370 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c380 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c390 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1c3a0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
1c3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c3c0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1c3d0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c3e0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1c3f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1c400 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1c410 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1c420 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
1c430 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
1c440 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
1c450 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
1c460 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
1c470 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1c480 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
1c490 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
1c4a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
1c4b0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1c4c0 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
1c4d0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
1c4e0 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
1c4f0 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
1c500 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
1c510 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
1c520 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
1c530 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1c540 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26  tmtInUse .     &
1c550 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
1c560 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26  nt(pPg) .     &&
1c570 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1c580 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1c590 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
1c5a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1c5b0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1c5c0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1c5d0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1c5e0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1c5f0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1c600 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1c610 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1c620 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c630 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
1c640 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1c650 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1c660 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1c670 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
1c680 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1c690 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1c6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1c6b0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
1c6c0 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
1c6d0 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1c6e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c6f0 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
1c700 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1c710 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1c720 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c730 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1c740 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61  ;.        page_a
1c750 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1c760 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pPg);.      }els
1c770 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
1c780 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
1c790 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1c7a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b  pPg->pgno, 7)-4;
1c7b0 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
1c7c0 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e  ts(pData2, pPg->
1c7d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  pgno);.        r
1c7e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c7f0 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
1c800 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1c810 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20  >pageSize+4);.  
1c820 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c830 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1c840 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1c850 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c860 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c870 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c890 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c8b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1c8c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
1c8d0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1c8e0 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
1c8f0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1c900 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1c910 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1c920 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  7);.      }.    
1c930 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1c940 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1c950 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1c960 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c970 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c980 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1c990 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1c9a0 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
1c9b0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1c9c0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
1c9d0 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
1c9e0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1c9f0 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
1ca00 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
1ca10 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
1ca20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
1ca30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ca40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ca50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ca60 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61  s used to mark a
1ca70 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72   data-page as wr
1ca80 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20  itable. It uses 
1ca90 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28  .** pager_write(
1caa0 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72  ) to open a jour
1cab0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20  nal file (if it 
1cac0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1cad0 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74  pen).** and writ
1cae0 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74  e the page *pDat
1caf0 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  a to the journal
1cb00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
1cb10 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1cb20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
1cb30 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
1cb40 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
1cb50 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
1cb60 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
1cb70 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
1cb80 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
1cb90 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
1cba0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
1cbb0 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
1cbc0 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
1cbd0 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
1cbe0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1cbf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1cc00 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1cc10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cc20 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
1cc30 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
1cc40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cc50 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
1cc60 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
1cc70 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1cc80 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
1cc90 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
1cca0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
1ccb0 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
1ccc0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
1ccd0 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
1cce0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
1ccf0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
1cd00 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
1cd10 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1cd20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1cd30 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
1cd40 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
1cd50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1cd60 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1cd70 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1cd80 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
1cd90 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
1cda0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cdb0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
1cdc0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
1cdd0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
1cde0 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74   ii;..    /* Set
1cdf0 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1ce00 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1ce10 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1ce20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1ce30 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1ce40 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1ce50 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1ce60 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1ce70 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1ce80 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1ce90 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1cea0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
1ceb0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1cec0 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
1ced0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
1cee0 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
1cef0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
1cf00 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
1cf10 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
1cf20 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
1cf30 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
1cf40 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
1cf50 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1cf60 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1cf70 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1cf80 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
1cf90 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
1cfa0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
1cfb0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
1cfc0 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
1cfd0 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
1cfe0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1cff0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
1d000 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
1d010 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1d020 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
1d030 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
1d040 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
1d050 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
1d060 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1d070 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
1d080 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
1d090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
1d0a0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
1d0b0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
1d0c0 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
1d0d0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
1d0e0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
1d0f0 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
1d100 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
1d110 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1d120 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
1d130 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
1d140 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
1d150 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69   pg1+ii;.      i
1d160 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
1d170 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50  ournal || pg==pP
1d180 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20  g->pgno || .    
1d190 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d        pg>pPager-
1d1a0 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21  >origDbSize || !
1d1b0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1d1c0 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70  nal[pg/8]&(1<<(p
1d1d0 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b  g&7))).      ) {
1d1e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
1d1f0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1d200 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1d210 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
1d220 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d230 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1d240 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
1d250 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d260 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d270 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1d280 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1d290 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
1d2a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1d2b0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1d2c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d2e0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1d2f0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1d300 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
1d310 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1d320 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1d330 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1d340 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
1d350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d360 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1d370 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
1d380 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1d390 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
1d3a0 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
1d3b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d3c0 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
1d3d0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
1d3e0 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
1d3f0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
1d400 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1d410 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
1d420 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1d430 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1d440 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
1d450 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
1d460 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  rty;.}.#endif..#
1d470 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d480 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
1d490 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
1d4a0 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
1d4b0 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
1d4c0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1d4d0 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
1d4e0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1d4f0 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65  e3PagerOverwrite
1d500 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1d510 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
1d520 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
1d530 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
1d540 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1d550 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1d560 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20   pgno, &pPg);.  
1d570 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d580 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1d590 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d5a0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1d5b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d5c0 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69       memcpy(sqli
1d5d0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
1d5e0 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61  pPg), pData, pPa
1d5f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1d600 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d610 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1d620 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d630 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1d640 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1d650 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1d660 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1d670 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1d680 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
1d690 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
1d6a0 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61  n page "pgno" ba
1d6b0 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
1d6c0 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
1d6d0 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
1d6e0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
1d6f0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
1d700 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
1d710 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
1d720 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
1d730 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
1d740 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1d750 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
1d760 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
1d770 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1d780 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
1d790 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
1d7a0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
1d7b0 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
1d7c0 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
1d7d0 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
1d7e0 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
1d7f0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1d800 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
1d810 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
1d820 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
1d830 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
1d840 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
1d850 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
1d860 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
1d870 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1d880 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1d890 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
1d8a0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
1d8b0 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
1d8c0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
1d8d0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d8e0 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
1d8f0 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
1d900 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
1d910 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
1d920 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
1d930 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
1d940 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
1d950 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
1d960 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1d970 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
1d980 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
1d990 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
1d9a0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
1d9b0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
1d9c0 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
1d9d0 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
1d9e0 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
1d9f0 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
1da00 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
1da10 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
1da20 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
1da30 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
1da40 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
1da50 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
1da60 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
1da70 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  ntRollback() rou
1da80 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1da90 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
1daa0 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
1dab0 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  s critical data,
1dac0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1dad0 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
1dae0 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  s.** rolled back
1daf0 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65   in spite of the
1db00 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1db10 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  tRollback() call
1db20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1db30 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1db40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1db50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1db60 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
1db70 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
1db80 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
1db90 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1dba0 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
1dbb0 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20  Pg!=0 );  /* We 
1dbc0 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74  never call _dont
1dbd0 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68  _write unless th
1dbe0 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d  e page is in mem
1dbf0 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79   */.  pPg->alway
1dc00 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1dc10 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1dc20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1dc30 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1dc40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1dc50 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1dc60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1dc70 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1dc80 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1dc90 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1dca0 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1dcb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1dcc0 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1dcd0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1dce0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1dcf0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1dd00 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1dd10 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1dd20 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1dd30 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1dd40 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1dd50 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1dd60 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1dd70 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1dd80 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1dd90 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1dda0 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1ddb0 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1ddc0 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1ddd0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1dde0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1ddf0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1de00 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1de10 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1de20 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1de30 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1de40 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1de50 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1de60 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1de70 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1de80 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1de90 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1dea0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1deb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1dec0 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
1ded0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1dee0 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41   %d\n", pgno, PA
1def0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1df00 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1df10 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
1df20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20  pPager, pgno)). 
1df30 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
1df40 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
1df50 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1df60 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
1df70 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1df80 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1df90 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1dfa0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1dfb0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1dfc0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1dfd0 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1dfe0 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1dff0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1e000 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1e010 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1e020 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1e030 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1e040 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1e050 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1e060 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1e070 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1e080 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
1e090 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e0a0 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50  lback(DbPage *pP
1e0b0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1e0c0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1e0d0 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  r;..  assert( pP
1e0e0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1e0f0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1e100 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1e110 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
1e120 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
1e130 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1e140 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
1e150 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
1e160 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1e170 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1e180 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1e190 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1e1a0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1e1b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e1c0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1e1d0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1e1e0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1e1f0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1e200 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1e210 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1e220 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
1e230 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1e240 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1e250 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1e260 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1e270 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20  pgno&7);.    }. 
1e280 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1e290 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
1e2a0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1e2b0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1e2c0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1e2d0 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
1e2e0 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
1e2f0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1e300 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1e310 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20  r->stmtInUse .  
1e320 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
1e330 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26  ment(pPg) .   &&
1e340 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1e350 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1e360 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  e .  ){.    asse
1e370 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1e380 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1e390 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1e3a0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
1e3b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1e3c0 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1e3d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1e3e0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1e3f0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1e400 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1e410 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1e420 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
1e430 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
1e440 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
1e450 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
1e460 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
1e470 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
1e480 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e490 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1e4a0 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
1e4b0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
1e4c0 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
1e4d0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
1e4e0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  nt rc;..  if( !p
1e4f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1e500 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a  ntDone ){.    /*
1e510 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1e520 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1e530 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
1e540 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1e550 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
1e560 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
1e570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e580 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
1e590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e5a0 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
1e5b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e5c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1e5d0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  .  .    /* Read 
1e5e0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
1e5f0 65 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f  e at byte 24. */
1e600 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
1e610 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32  ter = retrieve32
1e620 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29  bits(pPgHdr, 24)
1e630 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72  ;.  .    /* Incr
1e640 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1e650 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1e660 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1e670 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63  yte 24. */.    c
1e680 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
1e690 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28  .    put32bits((
1e6a0 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f  (char*)PGHDR_TO_
1e6b0 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34  DATA(pPgHdr))+24
1e6c0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1e6d0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 69  );.    pPager->i
1e6e0 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 63 68  ChangeCount = ch
1e6f0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
1e700 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
1e710 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
1e720 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
1e730 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1e740 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Hdr);.    pPager
1e750 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1e760 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
1e770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e780 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1e790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1e7a0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
1e7b0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1e7c0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1e7d0 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1e7e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1e7f0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1e800 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1e810 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1e820 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1e830 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1e840 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1e850 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1e860 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1e870 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1e880 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1e890 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1e8a0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1e8b0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1e8c0 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1e8d0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1e8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e8f0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1e900 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1e910 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1e920 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1e930 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1e940 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1e950 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1e960 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1e970 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1e980 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1e990 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1e9a0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1e9b0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1e9c0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1e9d0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1e9e0 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1e9f0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1ea00 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
1ea10 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1ea20 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
1ea30 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
1ea40 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
1ea50 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
1ea60 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
1ea70 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
1ea80 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
1ea90 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1eaa0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1eab0 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67  eOne(Pager *pPag
1eac0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
1ead0 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
1eae0 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
1eaf0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1eb00 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54  PAGERTRACE4("DAT
1eb10 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
1eb20 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
1eb30 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
1eb40 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
1eb50 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
1eb60 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49  nTrunc);..  /* I
1eb70 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
1eb80 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
1eb90 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
1eba0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
1ebb0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1ebc0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1ebd0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
1ebe0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1ebf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ec00 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
1ec10 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
1ec20 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1ec30 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1ec40 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
1ec50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ec60 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
1ec70 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1ec80 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
1ec90 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1eca0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
1ecb0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1ecc0 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
1ecd0 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
1ece0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
1ecf0 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
1ed00 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
1ed10 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
1ed20 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
1ed30 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
1ed40 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1ed50 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
1ed60 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
1ed70 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
1ed80 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
1ed90 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
1eda0 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
1edb0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1edc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1edd0 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1ede0 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
1edf0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
1ee00 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
1ee10 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1ee20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1ee30 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69  to sync_exit;.#i
1ee40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ee50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1ee60 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1ee70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
1ee80 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1ee90 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
1eea0 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
1eeb0 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
1eec0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  .        ** bein
1eed0 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
1eee0 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
1eef0 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
1ef00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1ef10 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
1ef20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ef30 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
1ef40 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
1ef50 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1ef60 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
1ef70 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
1ef80 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ef90 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
1efa0 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
1efb0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
1efc0 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
1efd0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
1efe0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1eff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1f000 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
1f010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1f020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f030 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1f040 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
1f050 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f060 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
1f070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1f080 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1f090 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f0a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f0b0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f0c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f0d0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
1f0e0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1f0f0 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
1f100 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
1f110 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
1f120 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f130 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f140 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1f150 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1f160 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f170 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1f180 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1f190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f1a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f1b0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1f1c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1f1d0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1f1e0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1f1f0 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
1f200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f210 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f220 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1f230 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
1f240 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
1f250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f260 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
1f270 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1f280 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
1f290 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1f2a0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
1f2b0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1f2c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1f2d0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1f2e0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
1f2f0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63   0;..    /* Sync
1f300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f310 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
1f320 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1f330 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1f340 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1f350 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
1f360 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
1f370 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
1f380 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
1f390 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1f3a0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65  _SYNCED;.  }else
1f3b0 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54   if( MEMDB && nT
1f3c0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  runc!=0 ){.    r
1f3d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f3e0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
1f3f0 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73   nTrunc);.  }..s
1f400 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  ync_exit:.  retu
1f410 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1f420 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
1f430 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1f440 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
1f450 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
1f460 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
1f470 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
1f480 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
1f490 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
1f4a0 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
1f4b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1f4c0 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
1f4d0 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
1f4e0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1f4f0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1f500 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f510 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20  tPhaseTwo(Pager 
1f520 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f530 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
1f540 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1f550 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1f560 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1f570 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1f580 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
1f590 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1f5a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1f5b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1f5c0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f   PAGERTRACE2("CO
1f5d0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1f5e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1f5f0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1f600 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1f610 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1f620 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
1f630 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
1f640 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1f650 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1f660 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1f670 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1f680 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
1f690 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1f6a0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1f6b0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1f6c0 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
1f6d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1f6e0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1f6f0 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
1f700 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
1f710 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1f720 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44     pPg = pPg->pD
1f730 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
1f740 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
1f750 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   0;.#ifndef NDEB
1f760 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
1f770 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
1f780 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
1f790 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
1f7a0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1f7b0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1f7c0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1f7d0 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
1f7e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
1f7f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1f800 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
1f810 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1f820 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
1f830 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1f840 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1f850 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1f860 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1f870 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1f880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1f890 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f8a0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1f8b0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
1f8c0 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  che );.  assert(
1f8d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1f8e0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
1f8f0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
1f900 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
1f910 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1f920 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ion(pPager);.  r
1f930 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1f940 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1f950 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1f960 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
1f970 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
1f980 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
1f990 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
1f9a0 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
1f9b0 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
1f9c0 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
1f9d0 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
1f9e0 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
1f9f0 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
1fa00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fa10 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
1fa20 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
1fa30 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
1fa40 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
1fa50 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
1fa60 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73  otocol or unless
1fa70 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
1fa80 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
1fa90 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
1faa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
1fab0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
1fac0 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
1fad0 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
1fae0 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
1faf0 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
1fb00 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
1fb10 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
1fb20 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
1fb30 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
1fb40 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1fb50 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1fb60 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
1fb70 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
1fb80 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1fb90 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
1fba0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
1fbb0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1fbc0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1fbd0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1fbe0 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
1fbf0 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
1fc00 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1fc10 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1fc20 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1fc30 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
1fc40 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
1fc50 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
1fc60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1fc70 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1fc80 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1fc90 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
1fca0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fcb0 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1fcc0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1fcd0 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
1fce0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
1fcf0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
1fd00 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
1fd10 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1fd20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1fd30 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1fd40 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1fd50 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1fd60 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
1fd70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fd80 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1fd90 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
1fda0 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
1fdb0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
1fdc0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1fdd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fde0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1fdf0 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
1fe00 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
1fe10 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1fe20 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
1fe30 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
1fe40 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
1fe50 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1fe60 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
1fe70 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
1fe80 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1fe90 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
1fea0 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
1feb0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1fec0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
1fed0 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
1fee0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1fef0 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d  niter(p, pPager-
1ff00 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1ff10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
1ff20 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
1ff30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
1ff40 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
1ff50 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1ff60 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1ff70 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
1ff80 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
1ff90 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1ffa0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
1ffb0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1ffc0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
1ffd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ffe0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
1fff0 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
20000 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
20010 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
20020 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
20030 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
20040 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
20050 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
20060 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20070 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
20080 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
20090 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
200a0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
200b0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
200c0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
200d0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
200e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
200f0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
20100 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
20110 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
20120 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
20130 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72    int rc2;.    r
20140 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
20150 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
20160 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
20170 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
20180 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
20190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
201a0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
201b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
201c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
201d0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
201e0 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67  0);.  }.  /* pag
201f0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
20200 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
20210 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f  bSize = -1;..  /
20220 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
20230 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
20240 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
20250 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
20260 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61  he pager.  ** ca
20270 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
20280 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
20290 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
202a0 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a  e any error .  *
202b0 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
202c0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  */.  return page
202d0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
202e0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc);.}../*.** Re
202f0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
20300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20310 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
20320 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
20330 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
20340 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
20350 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
20360 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20370 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
20380 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
20390 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
203a0 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
203b0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
203c0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
203d0 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
203e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
203f0 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
20400 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
20410 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b  rn pPager->nRef;
20420 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
20430 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69  E_TEST./*.** Thi
20440 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
20450 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
20460 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
20470 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
20480 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72  PagerStats(Pager
20490 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
204a0 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
204b0 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
204c0 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
204d0 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
204e0 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
204f0 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
20500 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
20510 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
20520 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
20530 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20540 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
20550 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
20560 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
20570 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a  .  a[8] = 0;  /*
20580 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67   Used to be pPag
20590 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61  er->nOvfl */.  a
205a0 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [9] = pPager->nR
205b0 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70  ead;.  a[10] = p
205c0 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20  Pager->nWrite;. 
205d0 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e   return a;.}.#en
205e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  dif../*.** Set t
205f0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
20600 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
20610 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20620 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
20630 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
20640 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
20650 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
20660 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
20670 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
20680 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
20690 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
206a0 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
206b0 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
206c0 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
206d0 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
206e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
206f0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
20700 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20710 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
20720 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
20730 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
20740 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20750 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
20760 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20770 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
20780 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
20790 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
207a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
207b0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
207c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
207d0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
207e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
207f0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
20800 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
20810 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
20820 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
20830 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
20840 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
20850 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
20860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20870 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
20880 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20890 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
208a0 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  nStmt = sqliteMa
208b0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
208c0 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
208d0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
208e0 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  tmt==0 ){.    /*
208f0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
20900 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
20910 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20  D_LOCK); */.    
20920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20930 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  MEM;.  }.#ifndef
20940 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73   NDEBUG.  rc = s
20950 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
20960 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
20970 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
20980 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
20990 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
209a0 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  iled;.  assert( 
209b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
209c0 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e == pPager->jou
209d0 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69  rnalOff );.#endi
209e0 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f.  pPager->stmt
209f0 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
20a00 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
20a10 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
20a20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20a30 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
20a40 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
20a50 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
20a60 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
20a70 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
20a80 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
20a90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20aa0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 70 50  agerOpentemp(&pP
20ab0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
20ac0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
20ad0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
20ae0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
20af0 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
20b00 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
20b10 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
20b20 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
20b30 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
20b40 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
20b50 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
20b60 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
20b70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
20b80 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
20b90 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
20ba0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
20bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
20bd0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
20be0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20bf0 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72  StmtCommit(Pager
20c00 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
20c10 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
20c20 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  se ){.    PgHdr 
20c30 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
20c40 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
20c50 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
20c60 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20c70 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
20c80 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
20c90 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
20ca0 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
20cb0 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72    /* sqlite3OsTr
20cc0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73  uncate(pPager->s
20cd0 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20  tfd, 0); */.    
20ce0 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
20cf0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b  ager->aInStmt );
20d00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
20d10 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
20d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
20d30 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
20d40 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
20d50 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  xt){.        PgH
20d60 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
20d70 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
20d80 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
20d90 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69 73      pNext = pHis
20da0 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  t->pNextStmt;.  
20db0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48        assert( pH
20dc0 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  ist->inStmt );. 
20dd0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e         pHist->in
20de0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
20df0 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74    pHist->pPrevSt
20e00 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  mt = pHist->pNex
20e10 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
20e20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
20e30 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
20e40 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
20e50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
20e60 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
20e70 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
20e80 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
20e90 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
20ea0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
20eb0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
20ec0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
20ed0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
20ee0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
20ef0 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
20f00 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
20f10 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62  e3PagerStmtRollb
20f20 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
20f30 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
20f40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
20f50 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47  InUse ){.    PAG
20f60 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52  ERTRACE2("STMT-R
20f70 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
20f80 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
20f90 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
20fa0 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
20fb0 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74  Pg;.      PgHist
20fc0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
20fd0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
20fe0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
20ff0 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  g=pHist->pNextSt
21000 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69  mt){.        pHi
21010 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
21020 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
21030 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
21040 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
21050 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
21060 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
21070 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  , pHist->pStmt, 
21080 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
210a0 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
210b0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
210c0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
210d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
210e0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
210f0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
21100 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20  er->stmtSize;.  
21110 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
21120 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
21130 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
21140 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
21150 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
21160 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
21170 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
21180 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
21190 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67  rStmtCommit(pPag
211a0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
211b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
211c0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
211d0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
211e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
211f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21200 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
21210 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21220 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
21230 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
21240 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
21250 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21260 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
21270 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
21280 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
21290 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
212a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
212b0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
212c0 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
212d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
212e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
212f0 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
21300 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
21310 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
21320 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21330 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
21340 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
21350 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
21360 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21370 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
21380 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
21390 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
213a0 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
213b0 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
213c0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
213d0 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
213e0 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
213f0 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
21400 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
21410 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
21420 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21430 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
21440 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
21450 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
21460 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
21470 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
21480 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
21490 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
214a0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
214b0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
214c0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
214d0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
214e0 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
214f0 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
21500 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
21510 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
21520 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
21530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21540 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
21550 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
21560 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
21570 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f  pData to locatio
21580 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
21590 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  le. .**.** There
215a0 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
215b0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75  rences to the cu
215c0 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e  rrent page pgno.
215d0 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65   If current page
215e0 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20  .** pgno is not 
215f0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
21600 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
21610 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74   it is not writt
21620 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62  en there by.** b
21630 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
21640 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73  The same applies
21650 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61   to the page pDa
21660 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20  ta refers to on 
21670 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73  entry to.** this
21680 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
21690 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
216a0 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74  e page refered t
216b0 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69  o by pData remai
216c0 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
216d0 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
216e0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
216f0 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69  th page pData (i
21700 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
21710 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
21720 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
21730 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
21740 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
21750 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
21760 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
21770 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
21780 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
21790 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
217a0 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
217b0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
217c0 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
217d0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
217e0 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
217f0 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
21800 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
21810 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
21820 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
21830 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
21840 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
21850 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
21860 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74   active)..*/.int
21870 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
21880 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  epage(Pager *pPa
21890 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67  ger, DbPage *pPg
218a0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
218b0 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a  PgHdr *pPgOld; .
218c0 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
218d0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
218e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
218f0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50  ->nRef>0 );..  P
21900 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45  AGERTRACE5("MOVE
21910 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
21920 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
21930 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
21940 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21950 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
21960 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f  ->needSync, pgno
21970 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
21980 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
21990 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
219a0 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66  no, pgno))..  if
219b0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
219c0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
219d0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
219e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
219f0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
21a00 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
21a10 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
21a20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
21a30 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
21a40 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
21a50 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
21a60 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
21a70 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
21a80 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
21a90 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
21aa0 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
21ab0 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
21ac0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
21ad0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
21ae0 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
21af0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
21b00 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
21b10 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
21b20 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
21b30 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
21b40 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
21b50 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
21b60 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
21b70 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
21b80 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
21b90 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
21ba0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
21bb0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
21bc0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
21bd0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
21be0 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
21bf0 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ;.    makeClean(
21c00 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28  pPgOld);.    if(
21c10 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
21c20 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
21c30 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
21c40 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
21c50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
21c60 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
21c70 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
21c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21c90 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
21ca0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
21cb0 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
21cc0 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
21cd0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
21ce0 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
21cf0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
21d00 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67  pgno!=0 );.  pPg
21d10 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
21d20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61   h = pgno & (pPa
21d30 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
21d40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
21d50 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73  sh[h] ){.    ass
21d60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
21d70 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
21d80 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
21d90 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
21da0 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
21db0 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
21dc0 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
21dd0 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d  sh[h];.  pPager-
21de0 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
21df0 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  .  pPg->pPrevHas
21e00 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69  h = 0;..  makeDi
21e10 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
21e20 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
21e30 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
21e40 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
21e50 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
21e60 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
21e70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
21e80 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
21e90 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
21ea0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
21eb0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
21ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
21ed0 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
21ee0 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
21ef0 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
21f00 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
21f10 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
21f20 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61   .    ** Pager.a
21f30 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61  InJournal bit ha
21f40 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
21f50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
21f60 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67  edied by loading
21f70 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
21f80 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
21f90 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
21fa0 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
21fb0 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a  Sync flag..    *
21fc0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
21fd0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63  ite3PagerGet() c
21fe0 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68  all may cause th
21ff0 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e  e journal to syn
22000 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  c. So make.    *
22010 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72  * sure the Pager
22020 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
22030 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a  s set too..    *
22040 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  /.    int rc;.  
22050 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
22060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22070 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
22080 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22090 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
220a0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
220b0 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
220c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
220d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
220e0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
220f0 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
22100 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
22110 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a  .    pPgHdr->inJ
22120 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
22130 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  makeDirty(pPgHdr
22140 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
22150 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
22160 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
22170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
22180 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
22190 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
221a0 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
221b0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
221c0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
221d0 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
221e0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
221f0 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  urn PGHDR_TO_DAT
22200 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  A(pPg);.}../*.**
22210 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22220 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e  r to the Pager.n
22230 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22  Extra bytes of "
22240 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a  extra" space .**
22250 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
22260 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
22270 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
22280 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
22290 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a  etExtra(DbPage *
222a0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
222b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
222c0 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ger;.  return (p
222d0 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45  Pager?PGHDR_TO_E
222e0 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
222f0 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ):0);.}../*.** G
22300 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69  et/set the locki
22310 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  ng-mode for this
22320 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
22330 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
22340 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f  one.** of PAGER_
22350 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
22360 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  Y, PAGER_LOCKING
22370 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a  MODE_NORMAL or .
22380 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
22390 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20  MODE_EXCLUSIVE. 
223a0 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
223b0 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
223c0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  then.** the lock
223d0 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  ing-mode is set 
223e0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
223f0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
22400 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
22410 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
22420 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
22430 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  MAL or.** PAGER_
22440 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
22450 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e  USIVE, indicatin
22460 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  g the current (p
22470 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
22480 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  .** locking-mode
22490 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
224a0 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
224b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
224c0 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
224d0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
224e0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
224f0 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
22500 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
22510 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
22520 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  MAL.            
22530 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
22540 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
22550 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
22560 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
22570 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
22580 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
22590 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
225a0 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c  AL>=0 && PAGER_L
225b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
225c0 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28  SIVE>=0 );.  if(
225d0 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50   eMode>=0 && !pP
225e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
225f0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  {.    pPager->ex
22600 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d  clusiveMode = eM
22610 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
22620 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
22630 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
22640 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
22650 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
22660 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
22670 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
22680 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
22690 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f  e of the file lo
226a0 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ck for the given
226b0 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72   pager..** The r
226c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f  eturn value is o
226d0 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53  ne of NO_LOCK, S
226e0 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
226f0 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45  RVED_LOCK,.** PE
22700 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45  NDING_LOCK, or E
22710 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
22720 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22730 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65  erLockstate(Page
22740 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
22750 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f  turn sqlite3OsLo
22760 63 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e  ckState(pPager->
22770 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  fd);.}.#endif..#
22780 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22790 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UG./*.** Print a
227a0 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20   listing of all 
227b0 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  referenced pages
227c0 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63   and their ref c
227d0 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
227e0 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d  lite3PagerRefdum
227f0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
22800 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
22810 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
22820 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
22830 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
22840 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
22850 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
22860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
22870 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25  ugPrintf("PAGE %
22880 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  3d addr=%p nRef=
22890 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70  %d\n", .       p
228a0 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f  Pg->pgno, PGHDR_
228b0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
228c0 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a  g->nRef);.  }.}.
228d0 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f  #endif..#endif /
228e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
228f0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.