/ Hex Artifact Content
Login

Artifact 42c77875451d04c149a27cea2bd4c917014ace4e:


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 33  : pager.c,v 1.33
0350: 39 20 32 30 30 37 2f 30 35 2f 30 39 20 31 35 3a  9 2007/05/09 15:
0360: 35 36 3a 34 30 20 64 61 6e 69 65 6c 6b 31 39 37  56:40 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63   OsFile.** struc
0710: 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65  t as it's argume
0720: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  nt..*/.#define P
0730: 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29  AGERID(p) ((int)
0740: 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65  (p->fd)).#define
0750: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0760: 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a  ) ((int)fd)../*.
0770: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0780: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0790: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
07a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
07b0: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
07c0: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
07d0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07f0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
0800: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0810: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
0820: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
0830: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0840: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0850: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0860: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0870: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0880: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08a0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
08b0: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
08c0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
08d0: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
0910: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
0920: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0950: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0960: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0980: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0990: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
09a0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
09b0: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
09c0: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
09d0: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09e0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
0a10: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
0a20: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
0a30: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a60: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a70: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a80: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0ab0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0ac0: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0af0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0b00: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0b10: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0b20: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0b30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b40: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b50: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b60: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0ba0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0bb0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0bc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0be0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bf0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0c00: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0c30: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c40: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c50: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c60: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c70: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c80: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0ca0: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0cb0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0cc0: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cf0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0d00: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0d10: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0d30: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d40: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d50: 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20  emove or.**     
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a    truncate the j
0d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
0d90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0da0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0db0: 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62            will b
0dc0: 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  e committed..**.
0dd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0de0: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41  e comes up in PA
0df0: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0e00: 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a   first time a.**
0e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
0e20: 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73  () occurs, the s
0e30: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e40: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
0e50: 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70  ..** After all p
0e60: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ages have been r
0e70: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
0e80: 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28  lite_page_unref(
0e90: 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ),.** the state 
0ea0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b  transitions back
0eb0: 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   to PAGER_UNLOCK
0ec0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0ed0: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0ee0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
0ef0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f00: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f10: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f20: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
0f40: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0f50: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0f60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0f70: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0f80: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0f90: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0fa0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
0fb0: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
0fc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0fd0: 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  ).** PAGER_RESER
0fe0: 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74  VED means that t
0ff0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20  here is an open 
1000: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1010: 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ..** The transit
1020: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1030: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62 65  LUSIVE occurs be
1040: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1050: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1060: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1070: 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65 73  e, though writes
1080: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1090: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75  .** journal occu
10a0: 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41 47  rs with just PAG
10b0: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66  ER_RESERVED.  Af
10c0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61  ter an sqlite3Pa
10d0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  gerRollback().**
10e0: 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
10f0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1100: 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e 20  , the state can 
1110: 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  go back to PAGER
1120: 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69  _SHARED,.** or i
1130: 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50 41  t can stay at PA
1140: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66  GER_EXCLUSIVE if
1150: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
1160: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
1170: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1180: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1190: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
11a0: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
11b0: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
11c0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
11d0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
11e0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
11f0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
1200: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1210: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1220: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1230: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1240: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1250: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1260: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1270: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1280: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1290: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
12a0: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
12b0: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
12c0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
12d0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
12e0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12f0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
1300: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
1310: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1320: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1330: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1340: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1350: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1360: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1370: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1380: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1390: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
13a0: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
13b0: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
13c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
13d0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
13e0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
13f0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
1400: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
1410: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1420: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1430: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1440: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1450: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1460: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1470: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1480: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1490: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
14a0: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
14b0: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
14c0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
14d0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
14e0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
14f0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
1500: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
1510: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1520: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1530: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1560: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1570: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1580: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
15a0: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
15b0: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
15c0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
15d0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
15e0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
15f0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
1600: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
1610: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1620: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1630: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1640: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1650: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1660: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1670: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1680: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1690: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
16a0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
16b0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
16c0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
16d0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
16e0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
16f0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1700: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1710: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1720: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1730: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1740: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1750: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1760: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1770: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1780: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17a0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
17b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
17c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
17d0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
17e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
17f0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1800: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1810: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1820: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1830: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1840: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1850: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1860: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1870: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1880: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1890: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
18a0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
18b0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
18c0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
18d0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
18e0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
18f0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1900: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1910: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1920: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1930: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1940: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1950: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1960: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1970: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1980: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1990: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
19a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
19b0: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
19c0: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
19d0: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
19e0: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
19f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1a00: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
1a10: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
1a20: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
1a50: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
1a60: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a70: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a80: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a90: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1aa0: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1ab0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1ac0: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1ad0: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1ae0: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1af0: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1b00: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1b20: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1b30: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1b40: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1b50: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b60: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1b70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1b80: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
1bb0: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
1bc0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
1bd0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf0: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
1c00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
1c10: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
1c20: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
1c40: 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  able DontRollbac
1c50: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
1c60: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 52 65  e */.  u8 needRe
1c70: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
1c80: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 63 6f        /* Read co
1c90: 6e 74 65 6e 74 20 69 66 20 50 61 67 65 72 57 72  ntent if PagerWr
1ca0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1cb0: 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e  */.  short int n
1cc0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1cd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ce0: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
1cf0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1d00: 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69  pDirty, *pPrevDi
1d10: 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79  rty;    /* Dirty
1d20: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20   pages */.  u32 
1d30: 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  notUsed;        
1d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1d50: 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69  ffer space */.#i
1d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1d70: 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61  K_PAGES.  u32 pa
1d80: 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20  geHash;.#endif. 
1d90: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /* pPager->page
1da0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61  Size bytes of pa
1db0: 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  ge data follow t
1dc0: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  his header */.  
1dd0: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
1de0: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
1df0: 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  ata follow the p
1e00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  age data */.};..
1e10: 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  /*.** For an in-
1e20: 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61  memory only data
1e30: 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61  base, some extra
1e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1e50: 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a  recorded about.*
1e60: 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74  * each page so t
1e70: 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20  hat changes can 
1e80: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1e90: 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20   (Journal files 
1ea0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20  are not.** used 
1eb0: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1ec0: 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66  tabases.)  The f
1ed0: 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61  ollowing informa
1ee0: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f  tion is added to
1ef0: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65  .** the end of e
1f00: 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b  very EXTRA block
1f10: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1f20: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
1f30: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1f40: 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
1f50: 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20   added directly 
1f60: 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72  to the PgHdr str
1f70: 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74  ucture..** But t
1f80: 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b  hen it would tak
1f90: 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20  e up an extra 8 
1fa0: 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65  bytes of storage
1fb0: 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a   on every PgHdr.
1fc0: 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b  ** even for disk
1fd0: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73  -based databases
1fe0: 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20  .  Splitting it 
1ff0: 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65  out saves 8 byte
2000: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  s.  This.** is o
2010: 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66  nly a savings of
2020: 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20   0.8% but those 
2030: 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20  percentages add 
2040: 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  up..*/.typedef s
2050: 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20  truct PgHistory 
2060: 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63  PgHistory;.struc
2070: 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20  t PgHistory {.  
2080: 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f  u8 *pOrig;     /
2090: 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  * Original page 
20a0: 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74  text.  Restore t
20b0: 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c  o this on a full
20c0: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75   rollback */.  u
20d0: 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a  8 *pStmt;     /*
20e0: 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20   Text as it was 
20f0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2100: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2110: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50  statement */.  P
2120: 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c  gHdr *pNextStmt,
2130: 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a   *pPrevStmt;  /*
2140: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
2150: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
2160: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2170: 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  inStmt;         
2180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2190: 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74  RUE if in the st
21a0: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
21b0: 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  al */.};../*.** 
21c0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
21d0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
21e0: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
21f0: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
2200: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
2210: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
2220: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
2230: 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78  Codec!=0 ){ P->x
2240: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2250: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64  rg,D,N,X); }.# d
2260: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
2270: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50  ,N,X) ((char*)(P
2280: 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78  ->xCodec!=0?P->x
2290: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
22a0: 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65  rg,D,N,X):D)).#e
22b0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  lse.# define COD
22c0: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20  EC1(P,D,N,X) /* 
22d0: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
22e0: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
22f0: 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e  ) ((char*)D).#en
2300: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2310: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2320: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2330: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2340: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2350: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2360: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2370: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2380: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2390: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
23a0: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
23b0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
23c0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
23d0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
23e0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
23f0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
2400: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2410: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2420: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2430: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2440: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2450: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2460: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2470: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
2480: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
2490: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
24a0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
24b0: 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64  .** Pager.errCod
24c0: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
24d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
24e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
24f0: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  .** or SQLITE_FU
2500: 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20  LL. Once one of 
2510: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
2520: 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69  errors occurs, i
2530: 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e  t persists.** an
2540: 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  d is returned as
2550: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65   the result of e
2560: 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72  very major pager
2570: 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a   API call.  The.
2580: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72  ** SQLITE_FULL r
2590: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
25a0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
25b0: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
25c0: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
25d0: 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20  next successful 
25e0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66  rollback is perf
25f0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67  ormed on the pag
2600: 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a  er cache. Also,.
2610: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  ** SQLITE_FULL d
2620: 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74  oes not affect t
2630: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2640: 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
2650: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  PagerLookup().**
2660: 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20   APIs, they may 
2670: 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75  still be used su
2680: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73  ccessfully..*/.s
2690: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
26a0: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26c0: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
26d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
26e0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
26f0: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
2700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2710: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
2720: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2730: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
2740: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2750: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
2760: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
2770: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
2780: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
27a0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
27b0: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
27c0: 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b  /.  u8 stmtOpen;
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
27f0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
2800: 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20  nal is open */. 
2810: 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20   u8 stmtInUse;  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2830: 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61  True we are in a
2840: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
2850: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  ansaction */.  u
2860: 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20  8 stmtAutoopen; 
2870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2880: 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20  en stmt journal 
2890: 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  when main journa
28a0: 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20  l is opened*/.  
28b0: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28d0: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
28e0: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
28f0: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
2920: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
2930: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
2940: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f 66 73 79  */.  u8 full_fsy
2950: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2960: 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c 46 53   /* Use F_FULLFS
2970: 59 4e 43 20 77 68 65 6e 20 61 76 61 69 6c 61 62  YNC when availab
2980: 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  le */.  u8 state
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
29b0: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
29c0: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
29d0: 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20  .  u8 tempFile; 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f0: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61  * zFilename is a
2a00: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2a10: 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79  */.  u8 readOnly
2a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a30: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
2a40: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
2a50: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  e */.  u8 needSy
2a60: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2a80: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
2a90: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
2aa0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43  l */.  u8 dirtyC
2ab0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2ac0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
2ad0: 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20  ched pages have 
2ae0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
2af0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
2b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
2b10: 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  ble DontRollback
2b20: 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  () for all pages
2b30: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
2b60: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
2b70: 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73  O */.  u8 setMas
2b80: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
2b90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2ba0: 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65  m-j name has bee
2bb0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e  n written to jrn
2bc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  l */.  u8 doNotS
2bd0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2be0: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57     /* Boolean. W
2bf0: 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f  hile true, do no
2c00: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
2c10: 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73  e */.  u8 exclus
2c20: 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  iveMode;        
2c30: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54     /* Boolean. T
2c40: 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d  rue if locking_m
2c50: 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a  ode==EXCLUSIVE *
2c60: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
2c70: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
2c80: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
2c90: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
2ca0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
2cb0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cd0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2ce0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2d20: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
2d30: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2d40: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2d50: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
2d60: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
2d70: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
2d80: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
2d90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2da0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2db0: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2dc0: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  in() */.  int nR
2dd0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2df0: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
2e00: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2e10: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
2e20: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2e30: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
2e40: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
2e50: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
2e60: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63  /.  int stmtNRec
2e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
2e90: 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62  ords in stmt sub
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2eb0: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
2ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2ed0: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
2ee0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2ef0: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2f00: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f20: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2f30: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  page */.  int nP
2f40: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f50: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
2f60: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
2f70: 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  ry pages */.  in
2f80: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2fa0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2fb0: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2fc0: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2fd0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2ff0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
3000: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
3010: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
3020: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
3030: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3040: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
3050: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
3060: 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e  /.  u8 *aInJourn
3070: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
3080: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
3090: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
30a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30b0: 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20  .  u8 *aInStmt; 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
30e0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
30f0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
3100: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
3110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3120: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3130: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
3140: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
3150: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3160: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3170: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
3180: 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20  irectory;       
3190: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
31a0: 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61   hold database a
31b0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
31c0: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64   */.  OsFile *fd
31d0: 2c 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  , *jfd;         
31e0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
31f0: 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61  ptors for databa
3200: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a  se and journal *
3210: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64  /.  OsFile *stfd
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
3240: 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  or for the state
3250: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a  ment subjournal*
3260: 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
3270: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20  *pBusyHandler;  
3280: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
3290: 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72  lite.busyHandler
32a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
32b0: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
32c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
32d0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
32e0: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
32f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
3300: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
3310: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
3320: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
3330: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
3340: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
3350: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
3360: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
3370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3380: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
3390: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
33a0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64  ournal */.  PgHd
33b0: 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20  r *pDirty;      
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
33d0: 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  of all dirty pag
33e0: 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  es */.  i64 jour
33f0: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
3400: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
3410: 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  yte offset in th
3420: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3430: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
3440: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3450: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
3460: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
3470: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  al header */.  i
3480: 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20  64 stmtHdrOff;  
3490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
34a0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
34b0: 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20  er written this 
34c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
34d0: 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20  64 stmtCksum;   
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b             /* ck
34f0: 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61  sumInit when sta
3500: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
3510: 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  ed */.  i64 stmt
3520: 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  JSize;          
3530: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
3540: 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62  ournal at stmt_b
3550: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
3560: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
3570: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
3580: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
3590: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
35a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
35b0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
35c0: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
35d0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
35e0: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
35f0: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
3600: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
3610: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
3620: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
3630: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
3640: 78 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50  xDestructor)(DbP
3650: 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  age*,int); /* Ca
3660: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3670: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
3680: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
3690: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
36a0: 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c  *,int);   /* Cal
36b0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
36c0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
36d0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
36e0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
36f0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
3700: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
3710: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
3720: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
3730: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
3740: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
3750: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3760: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
3770: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
3780: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
37b0: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  ger hash table *
37c0: 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  /.  PgHdr **aHas
37d0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
37e0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
37f0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
3800: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66   to PgHdr */.#if
3810: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3820: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
3830: 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65  ENT.  Pager *pNe
3840: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
3850: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
3860: 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68   of pagers in th
3870: 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e  is thread */.#en
3880: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
3890: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
38a0: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
38b0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
38c0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
38d0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
38e0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
38f0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
3900: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
3910: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a  e changes */.};.
3920: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
3930: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
3940: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
3950: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
3960: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
3970: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
3980: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
3990: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
39a0: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
39b0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
39c0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
39d0: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
39e0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
39f0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
3a00: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
3a10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3a20: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
3a30: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
3a40: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3a50: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
3a60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
3a70: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
3a80: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
3a90: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3aa0: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
3ab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3ac0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3ad0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
3ae0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
3af0: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
3b00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3b10: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
3b20: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
3b30: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
3b40: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
3b50: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
3b60: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
3b70: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
3b80: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
3b90: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
3ba0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
3bb0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
3bc0: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
3bd0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
3be0: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
3c00: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
3c10: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3c20: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
3c30: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
3c40: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3c50: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
3c60: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
3c70: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
3c80: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
3c90: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
3ca0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
3cb0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
3cc0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
3cd0: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
3ce0: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
3cf0: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
3d00: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
3d10: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
3d20: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
3d30: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
3d40: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
3d50: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
3d60: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
3d70: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
3d80: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
3d90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
3da0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
3db0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
3dc0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3dd0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
3de0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
3df0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
3e00: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
3e10: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
3e20: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
3e30: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
3e40: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
3e50: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
3e60: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
3e70: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
3e80: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
3e90: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
3ea0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
3eb0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
3ec0: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
3ed0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
3ee0: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
3ef0: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
3f00: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
3f10: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
3f20: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
3f30: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
3f40: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
3f50: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
3f60: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
3f70: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
3f80: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
3f90: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
3fa0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
3fb0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
3fc0: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
3fd0: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
3fe0: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
3ff0: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
4000: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
4010: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
4020: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
4030: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
4040: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
4050: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
4060: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
4070: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
4080: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
4090: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
40a0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
40b0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
40c0: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
40d0: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
40e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
40f0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
4100: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
4110: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4120: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
4130: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
4140: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
4150: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
4160: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
4170: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
4180: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
4190: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
41a0: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
41b0: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
41c0: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
41d0: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
41e0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
41f0: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
4200: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
4210: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
4220: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
4230: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
4240: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
4250: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4260: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4270: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4280: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4290: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
42a0: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
42b0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
42c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
42d0: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
42e0: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
42f0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4300: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
4310: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
4320: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
4330: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
4340: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
4350: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
4360: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4370: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4380: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
43a0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
43b0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
43c0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
43d0: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
43e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
43f0: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
4400: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
4410: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
4420: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
4430: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
4440: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
4450: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
4460: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
4470: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
4480: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
4490: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
44a0: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
44b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
44c0: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
44d0: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
44e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
44f0: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
4500: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
4510: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
4520: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
4530: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
4540: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
4550: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
4560: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
4570: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
4580: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
4590: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
45a0: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
45b0: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
45c0: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
45d0: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
45e0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
45f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
4600: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
4610: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
4620: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
4630: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72  ../*.** Enable r
4640: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74  eference count t
4650: 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62  racking (for deb
4660: 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f  ugging) here:.*/
4670: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4680: 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72  EBUG.  int pager
4690: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
46a0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
46b0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
46c0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
46d0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
46e0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
46f0: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
4700: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
4710: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4720: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
4730: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
4740: 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61  p nRef=%-3d tota
4750: 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
4760: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4770: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
4780: 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e  ef, p->pPager->n
4790: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
47a0: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
47b0: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
47c0: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
47d0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
47e0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
47f0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
4800: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4810: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
4820: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4830: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
4840: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
4850: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
4860: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
4870: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
4880: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
4890: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
48a0: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
48b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
48c0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
48d0: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
48e0: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
48f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
4900: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
4910: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
4920: 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f     return PGHDR_
4930: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
4940: 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20  ger)->inStmt;.  
4950: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
4960: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4970: 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50  ;.    u8 *a = pP
4980: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20  ager->aInStmt;. 
4990: 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26 20     return (a && 
49a0: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
49b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28  r->stmtSize && (
49c0: 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  a[pgno/8] & (1<<
49d0: 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d  (pgno&7))));.  }
49e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
49f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
4a00: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
4a10: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
4a20: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
4a30: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
4a40: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
4a50: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
4a60: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
4a70: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
4a80: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
4a90: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
4aa0: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48  N-1))==0 );.  aH
4ab0: 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ash = sqliteMall
4ac0: 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  oc( sizeof(aHash
4ad0: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20  [0])*N );.  if( 
4ae0: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
4af0: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
4b00: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
4b10: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
4b20: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
4b30: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
4b40: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
4b50: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
4b60: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
4b70: 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67  Hash = N;.  pPag
4b80: 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73  er->aHash = aHas
4b90: 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  h;.  for(pPg=pPa
4ba0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4bb0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
4bc0: 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  l){.    int h;. 
4bd0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
4be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
4bf0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
4c00: 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
4c10: 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
4c20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4c30: 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67     }.    h = pPg
4c40: 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a  ->pgno & (N-1);.
4c50: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
4c60: 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20  sh = aHash[h];. 
4c70: 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20     if( aHash[h] 
4c80: 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68  ){.      aHash[h
4c90: 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
4ca0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48  Pg;.    }.    aH
4cb0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
4cc0: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
4cd0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
4ce0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4cf0: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4d00: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d10: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4d20: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4d30: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4d40: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4d50: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4d60: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4d70: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4d80: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4d90: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4da0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4db0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4dc0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4de0: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4df0: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4e00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4e10: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4e20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4e30: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4e40: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4e60: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
4e70: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
4e80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4e90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4ea0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4eb0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
4ec0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
4ed0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
4ee0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
4ef0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
4f00: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
4f10: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4f20: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4f30: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4f40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4f50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4f60: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4f70: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4f80: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4f90: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4fa0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4fb0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4fc0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
4fd0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
4fe0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
4ff0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
5000: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
5010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
5020: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5030: 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65  at offset 'offse
5040: 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  t' from the page
5050: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
5060: 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27 70  * page header 'p
5070: 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  '..*/.static u32
5080: 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
5090: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
50a0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
50b0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
50c0: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
50d0: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
50e0: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
50f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5100: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 7d 0a  Get4byte(ac);.}.
5110: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5120: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
5130: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65  called when an e
5140: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
5150: 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  in the pager.** 
5160: 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20  code. The first 
5170: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
5180: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
5190: 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  er structure, th
51a0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20  e.** second the 
51b0: 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
51c0: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
51d0: 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
51e0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65  unction. .** The
51f0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5200: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
5210: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5220: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
5230: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
5240: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5250: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
5260: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
5270: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
5280: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
5290: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
52a0: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
52b0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
52c0: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
52d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
52e0: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
52f0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
5300: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
5310: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
5320: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
5330: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
5340: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5350: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
5360: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67  ITE_FULL || pPag
5370: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
5380: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a  ITE_OK );.  if(.
5390: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
53a0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
53b0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
53c0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
53d0: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
53e0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
53f0: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
5400: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
5410: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
5420: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
5430: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
5440: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
5450: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
5460: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
5470: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
5480: 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68  *pPage){.  u32 h
5490: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
54a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
54b0: 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69  r *pData = (unsi
54c0: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
54d0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
54e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
54f0: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
5500: 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  geSize; i++){.  
5510: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69    hash = (hash+i
5520: 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  )^pData[i];.  }.
5530: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
5540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
5550: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
5560: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
5570: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
5580: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5590: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
55a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
55b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
55c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
55d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
55e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
55f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
5600: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
5610: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
5620: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
5630: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
5640: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
5650: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
5660: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
5670: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5680: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
5690: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
56a0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
56b0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44  >errCode || MEMD
56c0: 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20  B || pPg->dirty 
56d0: 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  || .      pPg->p
56e0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
56f0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
5700: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
5710: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
5720: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
5730: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
5740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5750: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
5760: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
5770: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
5780: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5790: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
57a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
57b0: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
57c0: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
57d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
57e0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
57f0: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
5800: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5810: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
5820: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
5830: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
5840: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
5850: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
5860: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
5870: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
5880: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
5890: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
58a0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
58b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
58d0: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
58e0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
58f0: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
5900: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
5910: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
5920: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
5930: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5940: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
5950: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
5960: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
5970: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
5980: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
5990: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
59a0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
59b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
59c0: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
59d0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
59e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
59f0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a  pJrnl, szJ-16);.
5a00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5a10: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5a20: 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  . .  rc = read32
5a30: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e  bits(pJrnl, &len
5a40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5a50: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5a60: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
5a70: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63  32bits(pJrnl, &c
5a80: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
5a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5aa0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5ab0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5ac0: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b  rnl, aMagic, 8);
5ad0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5ae0: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
5af0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
5b00: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
5b10: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
5b20: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
5b30: 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  l, szJ-16-len);.
5b40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5b50: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5b60: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
5b70: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
5b80: 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69  lloc(len+1);.  i
5b90: 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b  f( !*pzMaster ){
5ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5bb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5bd0: 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73  ad(pJrnl, *pzMas
5be0: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
5bf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5c00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5c10: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5c20: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5c30: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5c40: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
5c50: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
5c60: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
5c70: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
5c80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
5c90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
5ca0: 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29  m -= (*pzMaster)
5cb0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [i];.  }.  if( c
5cc0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
5cd0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
5ce0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
5cf0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
5d00: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
5d10: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
5d20: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
5d40: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
5d50: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
5d60: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
5d70: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
5d80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5d90: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
5da0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
5db0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
5dc0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  me..    */.    s
5dd0: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5de0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5df0: 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ter = 0;.  }else
5e00: 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72  {.    (*pzMaster
5e10: 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  )[len] = '\0';. 
5e20: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
5e30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5e40: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
5e50: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5e60: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
5e70: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
5e80: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
5e90: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
5ea0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
5eb0: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
5ec0: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
5ed0: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
5ee0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
5ef0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
5f00: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
5f10: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
5f20: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
5f30: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
5f40: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
5fd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5fe0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
5ff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
6000: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
6010: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
6020: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
6030: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
6040: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
6050: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
6060: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
6070: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6080: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
6090: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
60a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
60b0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
60c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
60d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
60e0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
60f0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
6100: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6110: 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67  Pager) );.  pPag
6120: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
6130: 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72   offset;.  retur
6140: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  n sqlite3OsSeek(
6150: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6160: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
6170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6180: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6190: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
61a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
61b0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
61c0: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
61d0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
61e0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
61f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6200: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
6210: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
6220: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
6230: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
6240: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
6250: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
6260: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
6270: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
6280: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
6290: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
62a0: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
62b0: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
62c0: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
62d0: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
62e0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
62f0: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
6300: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
6310: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
6320: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
6330: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
6340: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
6350: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
6360: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
6370: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
6380: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6390: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
63a0: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
63b0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
63c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
63d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61   *pPager){.  cha
63e0: 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  r zHeader[sizeof
63f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6400: 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  16];.  int rc;..
6410: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
6420: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
6430: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
6440: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
6450: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
6460: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
6470: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6480: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6490: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
64a0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
64b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
64c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
64d0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
64e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
64f0: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
6500: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
6510: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
6520: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
6530: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
6540: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
6550: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
6560: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
6570: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
6580: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
6590: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
65a0: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
65b0: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
65c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
65d0: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
65e0: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
65f0: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
6600: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65   this..  */.  me
6610: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
6620: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6640: 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52  c));.  /* The nR
6650: 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46  ec Field. 0xFFFF
6660: 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63  FFFF for no-sync
6670: 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
6680: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6690: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
66a0: 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
66b0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
66c0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f  ffffff : 0);.  /
66d0: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
66e0: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
66f0: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
6700: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
6710: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
6720: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
6730: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
6740: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6750: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6760: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
6770: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6780: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
6790: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
67a0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
67b0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
67c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
67d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
67e0: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
67f0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
6800: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
6810: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6820: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6830: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
6840: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
6850: 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  Size);.  IOTRACE
6860: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
6870: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
6880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
6890: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
68a0: 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  r))).  rc = sqli
68b0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
68c0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
68d0: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
68e0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
68f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20  rnal header has 
6900: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63  been written suc
6910: 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20  cessfully. Seek 
6920: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
6930: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6940: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6950: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6960: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20  r sector..  */. 
6970: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6980: 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  OK ){.    IOTRAC
6990: 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c  E(("JTAIL %p %ll
69a0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
69b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
69c0: 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  -1)).    rc = sq
69d0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
69e0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
69f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
6a00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6a10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6a20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6a30: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6a40: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6a50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6a60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6a80: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6a90: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
6aa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6ab0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6ac0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
6ad0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6ae0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6af0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6b00: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
6b10: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6b20: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6b30: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6b40: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6b60: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6b70: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
6b80: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6b90: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
6ba0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
6bb0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6bc0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
6bd0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
6be0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6bf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
6c00: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
6c10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6c20: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6c30: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6c40: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6c50: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6c60: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6c70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
6c80: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6c90: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
6ca0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
6cb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6cc0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
6cd0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6ce0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6cf0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6d00: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6d10: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6d20: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6d30: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6d40: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6d50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6d60: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6d70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6d80: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
6d90: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
6da0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
6db0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6dc0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
6dd0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6de0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6df0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6e00: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6e10: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6e20: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6e30: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6e40: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6e50: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6e60: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6e70: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6e80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6e90: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6ea0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6eb0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6ec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ed0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6ee0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6ef0: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
6f00: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6f10: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
6f20: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6f30: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6f40: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6f50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6f60: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6f70: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6f80: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
6f90: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6fa0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
6fb0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6fc0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
6fd0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
6fe0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6ff0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7000: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7010: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
7020: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7030: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
7040: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7050: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
7060: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
7070: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
7080: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
7090: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
70a0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
70b0: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
70c0: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
70d0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
70e0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
70f0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
7100: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
7110: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
7120: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
7130: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
7140: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
7150: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
7160: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
7170: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
7180: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7190: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
71a0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
71b0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
71c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
71d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
71e0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
71f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
7210: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
7220: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7230: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
7240: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
7250: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
7260: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7270: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
7280: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
7290: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
72a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
72b0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
72c0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
72d0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
72e0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
72f0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
7300: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
7310: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
7320: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
7330: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
7340: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
7350: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
7360: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
7370: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
7380: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
7390: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
73a0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
73b0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
73c0: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
73d0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
73e0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
73f0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
7400: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
7410: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
7420: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
7430: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
7440: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
7450: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
7460: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
7470: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
7480: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
7490: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
74a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
74b0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
74c0: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
74d0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
74e0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
74f0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
7500: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
7510: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
7520: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
7530: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
7540: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
7550: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
7560: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
7570: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7580: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
7590: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
75a0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
75b0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
75c0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
75d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
75e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
75f0: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
7600: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
7610: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
7620: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
7630: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
7640: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
7650: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
7660: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
7670: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
7680: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
7690: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
76a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
76b0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
76c0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
76d0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
76e0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
76f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7700: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
7710: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
7720: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
7730: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
7740: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
7750: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7760: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
7770: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7780: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
7790: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
77a0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
77b0: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
77c0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
77d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
77e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
77f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7800: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7810: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
7820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7830: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7840: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7850: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
7860: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7870: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
7880: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
7890: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
78a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
78b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
78c0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
78d0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
78e0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
78f0: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
7900: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
7910: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
7920: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7930: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7940: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7950: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
7960: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
7970: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
7980: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
7990: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
79a0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
79b0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
79c0: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
79d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
79e0: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
79f0: 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  s the sqlite3Pag
7a00: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a  erStmtCommit().*
7a10: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7a20: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7a30: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
7a40: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
7a50: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
7a60: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
7a70: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
7a80: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
7a90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
7aa0: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
7ab0: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7ac0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7ad0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7ae0: 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79 20  er;.  PgHistory 
7af0: 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
7b00: 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
7b10: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  er);.  assert( M
7b20: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70  EMDB );.  if( !p
7b30: 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a  Hist->inStmt ){.
7b40: 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
7b50: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  t->pPrevStmt==0 
7b60: 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  && pHist->pNextS
7b70: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  tmt==0 );.    if
7b80: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7b90: 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f 54  ){.      PGHDR_T
7ba0: 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e 70  O_HIST(pPager->p
7bb0: 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e 70  Stmt, pPager)->p
7bc0: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a  PrevStmt = pPg;.
7bd0: 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74 2d      }.    pHist-
7be0: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
7bf0: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  ger->pStmt;.    
7c00: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
7c10: 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e  pPg;.    pHist->
7c20: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
7c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7c40: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
7c50: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
7c60: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
7c70: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7c80: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
7c90: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
7ca0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
7cb0: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
7cc0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
7cd0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7ce0: 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20  PgHdr *p;.  if( 
7cf0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30  pPager->aHash==0
7d00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7d10: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
7d20: 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  [pgno & (pPager-
7d30: 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68  >nHash-1)];.  wh
7d40: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
7d50: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
7d60: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
7d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
7d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
7d90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7da0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
7db0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
7dc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7dd0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
7de0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
7df0: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
7e00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
7e10: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7e20: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7e30: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
7e40: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49  ze = -1;.      I
7e50: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
7e60: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
7e70: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7e80: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
7e90: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  UNLOCK;.    pPag
7ea0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
7eb0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  one = 0;.  }.}..
7ec0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
7ed0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
7ee0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
7ef0: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
7f00: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
7f10: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20  file. This is a 
7f20: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
7f30: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
7f40: 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72  ntered.** the er
7f50: 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74  ror-state..*/.st
7f60: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
7f70: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
7f80: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
7f90: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ( p->errCode ) r
7fa0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
7fb0: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
7fc0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e  _RESERVED || p->
7fd0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
7fe0: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65  ;.  if( p->state
7ff0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
8000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
8010: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
8020: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
8030: 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ock(p);.  assert
8040: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
8050: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  !p->journalOpen 
8060: 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65  || (p->exclusive
8070: 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61  Mode&&!p->journa
8080: 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  lOff) );.  asser
8090: 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  t( p->errCode ||
80a0: 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c   !p->stmtOpen ||
80b0: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
80c0: 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  e );.}.../*.** C
80d0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
80e0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
80f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
8100: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
8110: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
8120: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
8130: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
8140: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
8150: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
8160: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
8170: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
8180: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
8190: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
81a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
81b0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
81c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
81d0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
81e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
81f0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
8200: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
8210: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
8220: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
8230: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8240: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
8250: 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
8260: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
8270: 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
8280: 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
8290: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
82a0: 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
82b0: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
82c0: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
82d0: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
82e0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
82f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8300: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
8310: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
8320: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
8330: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
8340: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
8350: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
8360: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  = 0;.  sqliteFre
8370: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
8380: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
8390: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
83a0: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50  >aHash = 0;.  pP
83b0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
83d0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
83e0: 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61  nsaction.  A tra
83f0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
8400: 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61  d by either.** a
8410: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
8420: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LBACK..**.** Whe
8430: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
8440: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
8450: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
8460: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
8470: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
8480: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
8490: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
84a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
84b0: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a   will release.**
84c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
84d0: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
84e0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
84f0: 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68   its place if th
8500: 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70  at is.** the app
8510: 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74  ropriate thing t
8520: 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c  o do.  Release l
8530: 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20  ocks usually is 
8540: 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20  appropriate,.** 
8550: 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e  unless we are in
8560: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
8570: 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73  s mode or unless
8580: 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43   this is a .** C
8590: 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20  OMMIT AND BEGIN 
85a0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20  or ROLLBACK AND 
85b0: 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e  BEGIN operation.
85c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
85d0: 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65  al file is eithe
85e0: 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75  r deleted or tru
85f0: 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  ncated..**.** TO
8600: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
8610: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
8620: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
8630: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8640: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
8650: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
8660: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
8670: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
8680: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
8690: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
86a0: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
86b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
86c0: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
86d0: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
86e0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
86f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8700: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
8710: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8720: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
8730: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8740: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
8750: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
8760: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8770: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
8780: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
8790: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
87a0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
87b0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
87c0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
87d0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
87e0: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
87f0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
8810: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
8820: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
8830: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8840: 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26  ode .          &
8850: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
8860: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
8870: 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49  ->jfd, 0))==SQLI
8880: 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20  TE_OK ){;.      
8890: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
88a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
88b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
88c0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
88d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
88e0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
88f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8900: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
8910: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
8920: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8930: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
8940: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8950: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
8970: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
8980: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  urnal);.      }.
8990: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
89a0: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
89b0: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
89c0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
89d0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
89e0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
89f0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
8a00: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
8a10: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
8a20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
8a30: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
8a40: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
8a50: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61   0;.      pPg->a
8a60: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
8a70: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
8a80: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
8a90: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
8aa0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
8ab0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
8ac0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
8ad0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
8ae0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
8af0: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
8b00: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
8b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8b20: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
8b30: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
8b40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8b50: 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
8b60: 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  | pPager->useJou
8b70: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
8b80: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
8b90: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
8ba0: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
8bb0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
8bc0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
8bd0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
8be0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
8bf0: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
8c00: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8c10: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
8c20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8c30: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
8c40: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
8c50: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8c60: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
8c70: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
8c80: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8c90: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8ca0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
8cb0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
8cc0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
8cd0: 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28   -1;..  return (
8ce0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
8cf0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
8d00: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
8d10: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
8d20: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
8d30: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
8d40: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
8d50: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8d60: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8d70: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8d80: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8d90: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8da0: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
8db0: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
8dc0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
8dd0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
8de0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
8df0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
8e00: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
8e10: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
8e20: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
8e30: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8e40: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
8e50: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8e60: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8e70: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8e80: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8e90: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8ea0: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
8eb0: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
8ec0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
8ed0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
8ee0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
8ef0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
8f00: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
8f10: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
8f20: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
8f30: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
8f40: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8f50: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8f60: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8f70: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8f80: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8f90: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8fa0: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
8fb0: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
8fc0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
8fd0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
8fe0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
8ff0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
9000: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
9010: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
9020: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
9030: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
9040: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
9050: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
9060: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
9070: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
9080: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
9090: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
90a0: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
90b0: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
90c0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
90d0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
90e0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
90f0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
9100: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
9110: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
9120: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
9130: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
9140: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
9150: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
9160: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
9170: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
9180: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
9190: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
91a0: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
91b0: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
91c0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
91d0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
91e0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
91f0: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
9200: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
9210: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
9220: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
9230: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
9240: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
9250: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
9260: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
9270: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
9280: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
9290: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
92a0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
92b0: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
92c0: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
92d0: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
92e0: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
92f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9300: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
9310: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
9320: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
9330: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
9340: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
9350: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
9360: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
9370: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
9380: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
9390: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
93b0: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
93c0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
93d0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
93f0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
9400: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
9410: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
9420: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
9430: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
9440: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
9450: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
9460: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
9470: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
9480: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
9490: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
94a0: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
94b0: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
94c0: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
94d0: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
94e0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
94f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
9500: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
9510: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
9520: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9530: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
9540: 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e  Cksum ? pPager->
9550: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
9560: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
9570: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
9580: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9590: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
95a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
95b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
95c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
95d0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
95e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
95f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9600: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9610: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9620: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
9630: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
9640: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
9650: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
9660: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
9670: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
9680: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
9690: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
96a0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
96b0: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
96c0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
96d0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
96e0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
96f0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
9700: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9710: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
9720: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
9730: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
9740: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
9750: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
9760: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
9770: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
9780: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
9790: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
97a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
97b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
97c0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
97d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
97e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
97f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
9800: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
9810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9820: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
9830: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9840: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
9850: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9860: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
9870: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
9880: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
9890: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
98a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
98b0: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
98c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
98d0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
98e0: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
98f0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9900: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9910: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
9920: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
9930: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
9940: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
9950: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
9960: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
9970: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
9980: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9990: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
99a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
99b0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
99c0: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
99d0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
99e0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
99f0: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
9a00: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
9a10: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
9a20: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
9a30: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
9a40: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
9a50: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
9a60: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
9a70: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
9a80: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
9a90: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
9aa0: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
9ab0: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
9ac0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
9ad0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
9ae0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
9af0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
9b00: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
9b10: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
9b20: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
9b30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
9b40: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
9b50: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
9b60: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
9b70: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
9b80: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
9b90: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
9ba0: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
9bb0: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
9bc0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
9bd0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
9be0: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
9bf0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
9c00: 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68  ntents are in th
9c10: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
9c20: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
9c30: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 66  therwise, if a f
9c40: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63  ull ROLLBACK occ
9c50: 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73 74  urs after the st
9c60: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  atement.  ** rol
9c70: 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52  lback the full R
9c80: 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74  OLLBACK will not
9c90: 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61 67   restore the pag
9ca0: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
9cb0: 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  l.  ** content. 
9cc0: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
9cd0: 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f  must be met befo
9ce0: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
9cf0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
9d00: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
9d10: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
9d20: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
9d30: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
9d40: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  iginal.  ** page
9d50: 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74   content is in t
9d60: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
9d70: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
9d80: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
9d90: 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20  n.  ** cache or 
9da0: 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65  else it is marke
9db0: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
9dc0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
9dd0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
9de0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
9df0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
9e00: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
9e10: 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b  IVE || pPg!=0 );
9e20: 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
9e30: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
9e40: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
9e50: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a  pPager), pgno);.
9e60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
9e70: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9e80: 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20  SIVE && (pPg==0 
9e90: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
9ea0: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==0) ){.    rc =
9eb0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
9ec0: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
9ed0: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
9ee0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9ef0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9f00: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
9f10: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9f20: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
9f30: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
9f40: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
9f50: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
9f60: 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
9f70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
9f80: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
9f90: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
9fa0: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
9fb0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
9fc0: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
9fd0: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
9fe0: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
9ff0: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
a000: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
a010: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
a020: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
a030: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
a040: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
a050: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
a060: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
a070: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
a080: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
a090: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
a0a0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
a0b0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
a0c0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
a0d0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f  id *pData;.    /
a0e0: 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e  * assert( pPg->n
a0f0: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
a100: 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  gno==1 ); */.   
a110: 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54   pData = PGHDR_T
a120: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20  O_DATA(pPg);.   
a130: 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61   memcpy(pData, a
a140: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
a150: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
a160: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a170: 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  er ){.      pPag
a180: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
a190: 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
a1a0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ize);.    }.#ifd
a1b0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
a1c0: 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
a1d0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
a1e0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
a1f0: 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20  endif.    /* If 
a200: 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
a210: 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
a220: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
a230: 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20  .dbFileVers..   
a240: 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f   ** Do this befo
a250: 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e  re any decoding.
a260: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
a270: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==1 ){.      mem
a280: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
a290: 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
a2a0: 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f  pData)[24],sizeo
a2b0: 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
a2c0: 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  Vers));.    }.. 
a2d0: 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65     /* Decode the
a2e0: 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20   page just read 
a2f0: 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20  from disk */.   
a300: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
a310: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
a320: 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 3);.  }.  retu
a330: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a340: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
a350: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
a360: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
a370: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
a380: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
a390: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
a3a0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
a3b0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
a3c0: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
a3d0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
a3e0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
a3f0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
a400: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
a410: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
a420: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
a430: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
a440: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
a450: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
a460: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
a470: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
a480: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
a490: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a4a0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
a4b0: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
a4c0: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
a4d0: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
a4e0: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
a4f0: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
a500: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
a510: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
a520: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
a530: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
a540: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
a550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a560: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
a570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
a580: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
a590: 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65    int master_ope
a5a0: 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20  n = 0;.  OsFile 
a5b0: 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63  *master = 0;.  c
a5c0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
a5d0: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
a5e0: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
a5f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
a600: 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
a610: 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
a620: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
a630: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
a640: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
a650: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a660: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
a670: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
a680: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
a690: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
a6a0: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
a6b0: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
a6c0: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
a6d0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
a6e0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
a6f0: 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ly(zMaster, &mas
a700: 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ter);.  assert( 
a710: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a720: 20 6d 61 73 74 65 72 20 29 3b 0a 20 20 69 66 28   master );.  if(
a730: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a740: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
a750: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
a760: 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  en = 1;.  rc = s
a770: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
a780: 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  (master, &nMaste
a790: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
a7a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a7b0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
a7c0: 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
a7d0: 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
a7e0: 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
a7f0: 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
a800: 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20  asterPtr = 0;.. 
a810: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
a820: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
a830: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
a840: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
a850: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
a860: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  Malloc() and poi
a870: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
a880: 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  erJournal. .    
a890: 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  */.    zMasterJo
a8a0: 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29  urnal = (char *)
a8b0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61  sqliteMalloc(nMa
a8c0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
a8d0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
a8e0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
a8f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a900: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
a910: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
a920: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
a930: 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c  e3OsRead(master,
a940: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
a950: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29   nMasterJournal)
a960: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
a970: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
a980: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
a990: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
a9a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
a9b0: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
a9c0: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
a9d0: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
a9e0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  l ){.      if( s
a9f0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
aa00: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
aa10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
aa20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
aa30: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
aa40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
aa50: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
aa60: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
aa70: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
aa80: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
aa90: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
aaa0: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
aab0: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
aac0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
aad0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
aae0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
aaf0: 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d  sFile *journal =
ab00: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
ab10: 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
ab20: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
ab30: 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c  adOnly(zJournal,
ab40: 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20   &journal);.    
ab50: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ab60: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f 75  SQLITE_OK || jou
ab70: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  rnal );.        
ab80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ab90: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
aba0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
abb0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
abc0: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
abd0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75  asterJournal(jou
abe0: 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74  rnal, &zMasterPt
abf0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
ac00: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72  te3OsClose(&jour
ac10: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
ac20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ac30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
ac40: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
ac50: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
ac60: 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
ac70: 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  tr!=0 && strcmp(
ac80: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
ac90: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
aca0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
acb0: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
acc0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
acd0: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
ace0: 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
acf0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
ad00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
ad10: 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
ad20: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
ad30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ad40: 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
ad50: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75   += (strlen(zJou
ad60: 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
ad70: 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
ad80: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d  lite3OsDelete(zM
ad90: 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74  aster);..delmast
ada0: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
adb0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
adc0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
add0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
ade0: 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74    }  .  if( mast
adf0: 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73  er_open ){.    s
ae00: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d  qlite3OsClose(&m
ae10: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
ae20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
ae30: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
ae40: 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
ae50: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f  ger *pPager);../
ae60: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
ae70: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
ae80: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
ae90: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
aea0: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
aeb0: 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74  ed. Also truncat
aec0: 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70  e the cached rep
aed0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
aee0: 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
aef0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
af00: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
af10: 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  ger, int nPage){
af20: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
af30: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
af40: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
af50: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
af60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
af70: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
af80: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
af90: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
afa0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
afb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
afc0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
afd0: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70  e = nPage;.    p
afe0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
aff0: 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  che(pPager);.  }
b000: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b010: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
b020: 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68  ectorSize for th
b030: 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
b040: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20  *.** The sector 
b050: 73 69 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67  size is the larg
b060: 65 72 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  er of the sector
b070: 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a   size reported.*
b080: 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  * by sqlite3OsSe
b090: 63 74 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74  ctorSize() and t
b0a0: 68 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a  he pageSize..*/.
b0b0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
b0c0: 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
b0d0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67  *pPager){.  pPag
b0e0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
b0f0: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
b100: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
b110: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b120: 73 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65  sectorSize<pPage
b130: 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
b140: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
b150: 72 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  rSize = pPager->
b160: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a  pageSize;.  }.}.
b170: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
b180: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
b190: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
b1a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b1b0: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
b1c0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
b1d0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
b1e0: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
b1f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
b200: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
b210: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
b220: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
b230: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
b240: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
b250: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
b260: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
b270: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
b280: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
b290: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
b2a0: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
b2b0: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
b2c0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b2d0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
b2e0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
b2f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
b300: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
b310: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
b320: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
b330: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
b340: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
b350: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
b360: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
b370: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
b380: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
b390: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
b3a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
b3b0: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
b3c0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
b3d0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
b3e0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
b3f0: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
b400: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b410: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b420: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
b430: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
b440: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
b450: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
b460: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
b470: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
b480: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
b490: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
b4a0: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
b4b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
b4c0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
b4d0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
b4e0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
b4f0: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
b500: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
b510: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
b520: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
b530: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
b540: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
b550: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b560: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
b570: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
b580: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
b590: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
b5a0: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
b5b0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
b5c0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
b5d0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
b5e0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
b5f0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
b600: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
b610: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
b620: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
b630: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
b640: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
b650: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
b660: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
b670: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
b680: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
b690: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
b6a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
b6b0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
b6c0: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
b6d0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
b6e0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
b6f0: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
b700: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
b710: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
b720: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
b730: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
b740: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
b750: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
b760: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
b770: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
b780: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b790: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
b7a0: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
b7b0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
b7c0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
b7d0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
b7e0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
b7f0: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
b800: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
b810: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
b820: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
b830: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
b840: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
b850: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
b860: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
b870: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
b880: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
b890: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
b8a0: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
b8b0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
b8c0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
b8d0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
b8e0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
b8f0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
b900: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
b910: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
b920: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
b930: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
b940: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
b950: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
b960: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
b970: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
b980: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
b990: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
b9a0: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
b9b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
b9c0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
b9d0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
b9e0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
b9f0: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
ba00: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
ba10: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
ba20: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
ba30: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
ba40: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
ba50: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
ba60: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
ba70: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
ba80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ba90: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
baa0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
bab0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
bac0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
bad0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
bae0: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
baf0: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
bb00: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
bb10: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
bb20: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
bb30: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
bb40: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
bb50: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
bb60: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
bb70: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
bb80: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
bb90: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
bba0: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
bbb0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
bbc0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
bbd0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
bbe0: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
bbf0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
bc00: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
bc10: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
bc20: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bc30: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 69 36  int isHot){.  i6
bc40: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
bc50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bc60: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bc70: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
bc80: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
bc90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bca0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
bcb0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
bcc0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
bce0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
bcf0: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
bd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
bd10: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
bd20: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
bd30: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd50: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
bd60: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
bd70: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
bd80: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
bd90: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
bda0: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
bdb0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
bdc0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
bdd0: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
bde0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
bdf0: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
be00: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
be10: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
be20: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
be30: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
be40: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
be50: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
be60: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
be70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
be80: 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
be90: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
bea0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
beb0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
bec0: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
bed0: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
bee0: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
bef0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
bf00: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
bf10: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
bf20: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
bf30: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
bf40: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
bf50: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
bf60: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
bf70: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
bf80: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
bf90: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
bfa0: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
bfb0: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
bfc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
bfd0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
bfe0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bff0: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
c000: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
c010: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
c020: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
c030: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
c040: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
c050: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c060: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
c070: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
c080: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
c090: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
c0a0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
c0b0: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  0);.  pPager->jo
c0c0: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
c0d0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
c0e0: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
c0f0: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
c100: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
c110: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
c120: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
c130: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
c140: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
c150: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
c160: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
c170: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
c180: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
c190: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
c1a0: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
c1b0: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
c1c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
c1d0: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
c1e0: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
c1f0: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
c200: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
c210: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
c220: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
c230: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
c240: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
c250: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
c260: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
c270: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
c280: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
c290: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
c2a0: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
c2b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
c2c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c2d0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
c2e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c2f0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
c300: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c310: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
c320: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
c330: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
c340: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
c350: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
c360: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
c370: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
c380: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
c390: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
c3a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
c3b0: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
c3c0: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
c3d0: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
c3e0: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
c3f0: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
c400: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
c410: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
c420: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
c430: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
c440: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
c450: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c460: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
c470: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
c480: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
c490: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
c4a0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c4b0: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
c4c0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
c4d0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
c4e0: 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
c4f0: 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
c500: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
c510: 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
c520: 2a 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20 74  ** process. In t
c530: 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 73  his case the res
c540: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c550: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
c560: 66 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  f.    ** journal
c570: 6c 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70 61  led copies of pa
c580: 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
c590: 20 62 65 20 72 65 61 64 20 62 61 63 6b 20 69 6e   be read back in
c5a0: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  to the cache..  
c5b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c5c0: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 29  c==0 && !isHot )
c5d0: 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
c5e0: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
c5f0: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
c600: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c610: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c620: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
c630: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
c640: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
c650: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
c660: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
c670: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
c680: 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  's original size
c690: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c6a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c6b0: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
c6c0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
c6d0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
c6e0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
c6f0: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
c700: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c710: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
c720: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
c730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c740: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
c750: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
c760: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
c770: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
c780: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
c790: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
c7a0: 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRec; i++){.  
c7b0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
c7c0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
c7d0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
c7e0: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
c7f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c800: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
c810: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
c820: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
c830: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c840: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c850: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
c860: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
c870: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
c880: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
c890: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
c8a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c8b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
c8c0: 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
c8d0: 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
c8e0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
c8f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c900: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
c910: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
c920: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
c930: 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( zMaster ){.  
c940: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61    /* If there wa
c950: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
c960: 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  al and this rout
c970: 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
c980: 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20  success,.    ** 
c990: 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
c9a0: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
c9b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c9c0: 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  al..    */.    i
c9d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c9e0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
c9f0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a  ager_delmaster(z
ca00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Master);.    }. 
ca10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
ca20: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
ca30: 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
ca40: 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
ca50: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
ca60: 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
ca70: 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
ca80: 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
ca90: 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
caa0: 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
cab0: 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
cac0: 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
cad0: 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
cae0: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
caf0: 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
cb00: 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
cb10: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
cb20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
cb30: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
cb40: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
cb50: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
cb60: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
cb70: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
cb80: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
cb90: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
cba0: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
cbb0: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
cbc0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
cbd0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
cbe0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
cbf0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
cc00: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
cc10: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
cc20: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
cc30: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
cc40: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
cc50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
cc60: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
cc70: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
cc80: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
cc90: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
cca0: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
ccb0: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
ccc0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
ccd0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
cce0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
ccf0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
cd00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
cd10: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
cd20: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
cd30: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
cd60: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
cd70: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
cd80: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
cd90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cda0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
cdb0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
cdc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
cdd0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
cde0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
cdf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ce00: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
ce10: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
ce20: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
ce30: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
ce40: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
ce50: 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69   &os_szJ);.    i
ce60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ce70: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ce80: 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f    assert( szJ==o
ce90: 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e  s_szJ );.  }.#en
cea0: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64  dif..  /* Set hd
ceb0: 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f  rOff to be the o
cec0: 66 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72  ffset just after
ced0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cee0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  last journal.  *
cef0: 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62  * page written b
cf00: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
cf10: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66  journal-header f
cf20: 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  or this statemen
cf30: 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  t.  ** transacti
cf40: 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20  on was written, 
cf50: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
cf60: 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75  e file if no jou
cf70: 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72  rnal.  ** header
cf80: 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20   was written..  
cf90: 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50  */.  hdrOff = pP
cfa0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
cfb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
cfc0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20  er->fullSync || 
cfd0: 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28  !hdrOff );.  if(
cfe0: 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20   !hdrOff ){.    
cff0: 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  hdrOff = szJ;.  
d000: 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61  }.  .  /* Trunca
d010: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
d020: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
d030: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a  inal size..  */.
d040: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
d050: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
d060: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b  ager->stmtSize);
d070: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d080: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
d090: 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  SHARED );..  /* 
d0a0: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
d0b0: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
d0c0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
d0d0: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
d0e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
d0f0: 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50  >stmtInUse && pP
d100: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
d110: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
d120: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66  Seek(pPager->stf
d130: 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20  d, 0);.  nRec = 
d140: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
d150: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
d160: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
d170: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
d180: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
d190: 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
d1a0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
d1b0: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
d1c0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d1d0: 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
d1e0: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
d1f0: 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
d200: 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
d210: 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
d220: 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
d230: 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
d240: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ..  */.  for(i=n
d250: 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Rec-1; i>=0; i--
d260: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
d270: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
d280: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
d290: 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
d2a0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d2b0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d2c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d2d0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
d2e0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
d2f0: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
d300: 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
d310: 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
d320: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
d330: 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
d340: 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
d350: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
d360: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
d370: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
d380: 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
d390: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
d3a0: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
d3b0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
d3c0: 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
d3d0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
d3e0: 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
d3f0: 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
d400: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
d410: 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
d420: 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
d430: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
d440: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
d450: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
d460: 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
d470: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
d480: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
d490: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
d4a0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
d4b0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
d4c0: 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
d4d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d4e0: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  {.    goto end_s
d4f0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
d500: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
d510: 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
d520: 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
d530: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
d540: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
d550: 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  sum;.  while( pP
d560: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d570: 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20   < hdrOff ){.   
d580: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
d590: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
d5a0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
d5b0: 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 1);.    asser
d5c0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
d5d0: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
d5e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
d5f0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
d600: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  back;.  }..  whi
d610: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
d620: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a  nalOff < szJ ){.
d630: 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20      u32 nJRec;  
d640: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d650: 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
d660: 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
d670: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
d680: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
d690: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  ager, szJ, &nJRe
d6a0: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
d6b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d6c0: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
d6d0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
d6e0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
d6f0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d700: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
d710: 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20  ( nJRec==0 ){.  
d720: 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a      nJRec = (szJ
d730: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
d740: 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
d750: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
d760: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
d770: 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20  JRec-1; i>=0 && 
d780: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d790: 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a  ff < szJ; i--){.
d7a0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
d7b0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d7c0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d7d0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d7e0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d7f0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d800: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d810: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
d820: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
d830: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
d840: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d850: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
d860: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
d870: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
d880: 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
d890: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
d8a0: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
d8b0: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
d8c0: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
d8d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d8e0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
d8f0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
d900: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
d910: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
d920: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
d930: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
d940: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d950: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
d960: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
d970: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
d980: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
d990: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
d9a0: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20  ->mxPage = 10;. 
d9b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
d9c0: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
d9d0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
d9e0: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
d9f0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
da00: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
da10: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
da20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
da30: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
da40: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
da50: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
da60: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
da70: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
da80: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
da90: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
daa0: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
dab0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
dad0: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
dae0: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
daf0: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
db00: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
db10: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
db20: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
db30: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
db40: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
db50: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
db60: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
db70: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
db80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
db90: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
dba0: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
dbb0: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
dbc0: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
dbd0: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
dbe0: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
dbf0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
dc00: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
dc20: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
dc30: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
dc40: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
dc50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
dc60: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
dc70: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
dc80: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
dc90: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
dca0: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
dcb0: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
dcc0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
dcd0: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
dce0: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
dcf0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
dd00: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
dd20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
dd30: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
dd40: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
dd50: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
dd60: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
dd70: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
dd80: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
dda0: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
ddb0: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
ddc0: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
ddd0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
dde0: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
ddf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
de00: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
de10: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
de20: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
de30: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
de40: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
de50: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
de60: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
de70: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
de80: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
de90: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
dea0: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
deb0: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
dec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ded0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
dee0: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
def0: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
df00: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
df10: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
df20: 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  l_fsync){.  pPag
df30: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
df40: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
df50: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
df60: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
df70: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
df80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
df90: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66    pPager->full_f
dfa0: 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e  sync = full_fsyn
dfb0: 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  c;.  if( pPager-
dfc0: 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
dfd0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
dfe0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
dff0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
e000: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
e010: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
e020: 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
e030: 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
e040: 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
e050: 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
e060: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
e070: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
e080: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
e090: 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
e0a0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
e0b0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
e0c0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
e0d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
e0e0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
e0f0: 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68   .**.** Write th
e100: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
e110: 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74  r into *fd.  Ret
e120: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
e130: 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65   success or some
e140: 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20  .** other error 
e150: 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
e160: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69  .**.** The OS wi
e170: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
e180: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
e190: 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
e1a0: 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e  it is.** closed.
e1b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
e1c0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
e1d0: 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64  emp(OsFile **pFd
e1e0: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38  ){.  int cnt = 8
e1f0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
e200: 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f  ar zFile[SQLITE_
e210: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
e220: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
e230: 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
e240: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
e250: 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
e260: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
e270: 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
e280: 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d  .  do{.    cnt--
e290: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
e2a0: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c  empFileName(zFil
e2b0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
e2c0: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
e2d0: 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20  ive(zFile, pFd, 
e2e0: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
e2f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
e300: 20 2a 70 46 64 20 29 3b 0a 20 20 7d 77 68 69 6c   *pFd );.  }whil
e310: 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d  e( cnt>0 && rc!=
e320: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
e330: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
e340: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e350: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
e360: 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61  new page cache a
e370: 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
e380: 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63   to the page cac
e390: 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a  he in *ppPager..
e3a0: 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62  ** The file to b
e3b0: 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f  e cached need no
e3c0: 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69  t exist.  The fi
e3d0: 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64  le is not locked
e3e0: 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69   until.** the fi
e3f0: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
e400: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e  te3PagerGet() an
e410: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
e420: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
e430: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
e440: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
e450: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
e460: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
e470: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
e480: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
e490: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
e4a0: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
e4b0: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
e4c0: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
e4d0: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
e4e0: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
e4f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
e500: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
e510: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
e520: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
e530: 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72  " then all infor
e540: 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
e550: 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69  n cache..** It i
e560: 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
e570: 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63  to disk.  This c
e580: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
e590: 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e  plement an.** in
e5a0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e5b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e5c0: 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61 67  PagerOpen(.  Pag
e5d0: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
e5e0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e5f0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
e600: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
e610: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
e620: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
e630: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
e640: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
e650: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
e660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
e670: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
e680: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
e690: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
e6a0: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
e6b0: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
e6c0: 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
e6d0: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
e6e0: 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
e6f0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
e700: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
e710: 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d  nameLen;  /* Com
e720: 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20  piler is wrong. 
e730: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69  This is always i
e740: 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
e750: 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c  e use */.  OsFil
e760: 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20 69 6e 74  e *fd = 0;.  int
e770: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e780: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
e790: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
e7a0: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
e7b0: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
e7c0: 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
e7d0: 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
e7e0: 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
e7f0: 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
e800: 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
e810: 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
e820: 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72  LOCK)!=0;.  char
e830: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
e840: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69  MPNAME_SIZE];.#i
e850: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e860: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
e870: 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
e880: 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
e890: 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
e8a0: 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
e8b0: 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
e8c0: 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
e8d0: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
e8e0: 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
e8f0: 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
e900: 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
e910: 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
e920: 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
e930: 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
e940: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
e950: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
e960: 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
e970: 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
e980: 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e  t. It would be n
e990: 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20  ice to assert.  
e9a0: 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64 44 61  ** that ThreadDa
e9b0: 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e  ta.nAlloc is non
e9c0: 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20  -zero, but alas 
e9d0: 74 68 69 73 20 62 72 65 61 6b 73 20 74 65 73 74  this breaks test
e9e0: 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69   cases .  ** wri
e9f0: 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74  tten to invoke t
ea00: 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6c  he pager directl
ea10: 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  y..  */.  Thread
ea20: 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
ea30: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
ea40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
ea50: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
ea60: 20 57 65 20 75 73 65 64 20 74 6f 20 74 65 73 74   We used to test
ea70: 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 64   if malloc() had
ea80: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20   already failed 
ea90: 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e  before proceedin
eaa0: 67 2e 20 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  g. .  ** But the
eab0: 20 77 61 79 20 74 68 69 73 20 66 75 6e 63 74 69   way this functi
eac0: 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 53 51  on is used in SQ
ead0: 4c 69 74 65 20 6d 65 61 6e 73 20 74 68 61 74 20  Lite means that 
eae0: 63 61 6e 20 6e 65 76 65 72 0a 20 20 2a 2a 20 68  can never.  ** h
eaf0: 61 70 70 65 6e 2e 20 46 75 72 74 68 65 72 6d 6f  appen. Furthermo
eb00: 72 65 2c 20 69 66 20 74 68 65 20 6d 61 6c 6c 6f  re, if the mallo
eb10: 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 69 73  c-failed flag is
eb20: 20 61 6c 72 65 61 64 79 20 73 65 74 2c 20 0a 20   already set, . 
eb30: 20 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20 63   ** either the c
eb40: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 53 74 72  all to sqliteStr
eb50: 44 75 70 28 29 20 6f 72 20 73 71 6c 69 74 65 4d  Dup() or sqliteM
eb60: 61 6c 6c 6f 63 28 29 20 62 65 6c 6f 77 20 77 69  alloc() below wi
eb70: 6c 6c 0a 20 20 2a 2a 20 66 61 69 6c 20 73 68 6f  ll.  ** fail sho
eb80: 72 74 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  rtly and SQLITE_
eb90: 4e 4f 4d 45 4d 20 72 65 74 75 72 6e 65 64 20 61  NOMEM returned a
eba0: 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 2a 70  nyway..  */.  *p
ebb0: 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
ebc0: 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
ebd0: 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46   file and set zF
ebe0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70  ullPathname to p
ebf0: 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29  oint at malloc()
ec00: 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  ed .  ** memory 
ec10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
ec20: 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65  omplete filename
ec30: 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67   (i.e. including
ec40: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e   the directory).
ec50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
ec60: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
ec70: 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
ec80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
ec90: 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
eca0: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
ecb0: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
ecc0: 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
ecd0: 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  ;.      zFullPat
ece0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  hname = sqliteSt
ecf0: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65  rDup("");.    }e
ed00: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
ed10: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
ed20: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
ed30: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
ed40: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
ed50: 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  f( zFullPathname
ed60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ed70: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
ed80: 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74  adWrite(zFullPat
ed90: 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  hname, &fd, &rea
eda0: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 20 20  dOnly);.        
edb0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
edc0: 54 45 5f 4f 4b 20 7c 7c 20 66 64 20 29 3b 0a 20  TE_OK || fd );. 
edd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ede0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
edf0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
ee00: 65 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71  emp(&fd);.    sq
ee10: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
ee20: 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ame(zTemp);.    
ee30: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
ee40: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
ee50: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
ee60: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
ee70: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
ee80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ee90: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
eea0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
eeb0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
eec0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
eed0: 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74  re. As part of t
eee0: 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69  he same allocati
eef0: 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  on, allocate.  *
ef00: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
ef10: 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68  full paths of th
ef20: 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72  e file, director
ef30: 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20  y and journal . 
ef40: 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65   ** (Pager.zFile
ef50: 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72  name, Pager.zDir
ef60: 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72  ectory and Pager
ef70: 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f  .zJournal)..  */
ef80: 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68  .  if( zFullPath
ef90: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65  name ){.    name
efa0: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75  Len = strlen(zFu
efb0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
efc0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
efd0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
efe0: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
eff0: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20  n*3 + 30 );.    
f000: 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63  if( pPager && rc
f010: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f020: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
f030: 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a  pSpace = (char *
f040: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77  )sqliteMallocRaw
f050: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
f060: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
f070: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
f080: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
f090: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
f0a0: 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
f0b0: 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  free the memory 
f0c0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  .  ** pointed to
f0d0: 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d   by zFullPathnam
f0e0: 65 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65  e, free the Page
f0f0: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
f100: 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  close the .  ** 
f110: 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20  file. Since the 
f120: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c  pager is not all
f130: 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20  ocated there is 
f140: 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a  no need to set .
f150: 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65    ** any Pager.e
f160: 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73  rrMask variables
f170: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
f180: 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61  ager || !zFullPa
f190: 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65  thname || !pPage
f1a0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20  r->pTmpSpace || 
f1b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f1c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
f1d0: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71  ose(&fd);.    sq
f1e0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f1f0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  thname);.    sql
f200: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
f210: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
f220: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
f230: 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
f240: 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
f250: 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
f260: 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  , FILEHANDLEID(f
f270: 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  d), zFullPathnam
f280: 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
f290: 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
f2a0: 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68  Pager, zFullPath
f2b0: 6e 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d  name)).  pPager-
f2c0: 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
f2d0: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  ar*)&pPager[1];.
f2e0: 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
f2f0: 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
f300: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
f310: 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n+1];.  pPager->
f320: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
f330: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
f340: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 6d 65 6d  ameLen+1];.  mem
f350: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
f360: 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  ename, zFullPath
f370: 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29  name, nameLen+1)
f380: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  ;.  memcpy(pPage
f390: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
f3a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61  FullPathname, na
f3b0: 6d 65 4c 65 6e 2b 31 29 3b 0a 0a 20 20 66 6f 72  meLen+1);..  for
f3c0: 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20  (i=nameLen; i>0 
f3d0: 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
f3e0: 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
f3f0: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
f400: 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
f410: 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
f420: 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
f430: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c  ->zJournal, zFul
f440: 6c 50 61 74 68 6e 61 6d 65 2c 6e 61 6d 65 4c 65  lPathname,nameLe
f450: 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  n);.  sqliteFree
f460: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f470: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65  .  memcpy(&pPage
f480: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
f490: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
f4a0: 2c 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61  ,sizeof("-journa
f4b0: 6c 22 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  l"));.  pPager->
f4c0: 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50  fd = fd;.  /* pP
f4d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
f4e0: 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  n = 0; */.  pPag
f4f0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
f500: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
f510: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
f520: 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f  >noReadlock = no
f530: 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
f540: 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
f550: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
f560: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f570: 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
f580: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f590: 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
f5a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
f5b0: 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
f5c0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51  r->pageSize = SQ
f5d0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
f5e0: 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61  E_SIZE;.  /* pPa
f5f0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
f600: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f610: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
f620: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f630: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
f640: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
f650: 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
f660: 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
f670: 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
f680: 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
f690: 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20  R_UNLOCK==0 );. 
f6a0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
f6b0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
f6c0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f6d0: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
f6e0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
f6f0: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
f700: 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
f710: 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
f720: 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
f730: 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
f740: 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
f750: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
f760: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
f770: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
f780: 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
f790: 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
f7a0: 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46  siveMode = tempF
f7b0: 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
f7c0: 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20  memDb = memDb;. 
f7d0: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
f7e0: 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  y = readOnly;.  
f7f0: 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  /* pPager->needS
f800: 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ync = 0; */.  pP
f810: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
f820: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
f830: 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  || !useJournal;.
f840: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
f850: 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f  nc = (pPager->no
f860: 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20  Sync?0:1);.  /* 
f870: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
f880: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f890: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
f8a0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f8b0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
f8c0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
f8d0: 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
f8e0: 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
f8f0: 20 20 61 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d    assert(fd||mem
f900: 44 62 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44  Db);.  if( !memD
f910: 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74  b ){.    setSect
f920: 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
f930: 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
f940: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
f950: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
f960: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
f970: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
f980: 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
f990: 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
f9a0: 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
f9b0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
f9c0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61  MANAGEMENT.  pPa
f9d0: 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73  ger->pNext = pTs
f9e0: 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73  d->pPager;.  pTs
f9f0: 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  d->pPager = pPag
fa00: 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  er;.#endif.  ret
fa10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fa20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fa30: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
fa40: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
fa50: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
fa60: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
fa70: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
fa80: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
fa90: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
faa0: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
fab0: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
fac0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
fad0: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
fae0: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
faf0: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
fb00: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
fb10: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
fb20: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
fb30: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
fb40: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
fb50: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
fb60: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
fb70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
fb80: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
fb90: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
fba0: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
fbb0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
fbc0: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
fbd0: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50   result sqlite3P
fbe0: 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a  agerClose().  .*
fbf0: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
fc00: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
fc10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
fc20: 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ef()..*/.void sq
fc30: 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73  lite3PagerSetDes
fc40: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
fc50: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
fc60: 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  esc)(DbPage*,int
fc70: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44  )){.  pPager->xD
fc80: 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73  estructor = xDes
fc90: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
fca0: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
fcb0: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
fcc0: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
fcd0: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
fce0: 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77  r.** is called w
fcf0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
fd00: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63  of a page in cac
fd10: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
fd20: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a  o its original.*
fd30: 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73  * value as a res
fd40: 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ult of a rollbac
fd50: 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  k.  The callback
fd60: 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65   gives higher-le
fd70: 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f  vel code.** an o
fd80: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65  pportunity to re
fd90: 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20  store the EXTRA 
fda0: 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65  section to agree
fdb0: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
fdc0: 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  ed.** page data.
fdd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fde0: 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
fdf0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fe00: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
fe10: 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
fe20: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
fe30: 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a  er = xReinit;.}.
fe40: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
fe50: 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72  age size.  Retur
fe60: 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20  n the new size. 
fe70: 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20   If the suggest 
fe80: 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  new page.** size
fe90: 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74   is inappropriat
fea0: 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72  e, then an alter
feb0: 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65  native page size
fec0: 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20   is selected.** 
fed0: 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  and returned..*/
fee0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
fef0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
ff00: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
ff10: 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73  pageSize){.  ass
ff20: 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35  ert( pageSize>=5
ff30: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
ff40: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
ff50: 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70  SIZE );.  if( !p
ff60: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20  Pager->memDb && 
ff70: 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
ff80: 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
ff90: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
ffa0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ffb0: 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
ffc0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
ffd0: 63 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c  ce = sqlite3Real
ffe0: 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65 72  locOrFree(pPager
fff0: 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67  ->pTmpSpace, pag
10000 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65  eSize);.  }.  re
10010 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67  turn pPager->pag
10020 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
10030 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
10040 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
10050 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
10060 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
10070 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
10080 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
10090 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
100a0 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
100b0 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
100c0 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
100d0 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
100e0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
100f0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
10100 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
10110 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
10120 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
10130 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
10140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
10150 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
10160 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
10170 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
10180 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
10190 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
101a0 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
101b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
101c0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
101d0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
101e0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
101f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
10200 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
10210 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
10220 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
10230 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
10240 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
10250 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
10260 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
10270 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
10280 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
10290 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
102a0 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
102b0 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
102c0 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
102d0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
102e0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
102f0 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
10300 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
10310 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
10320 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
10330 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
10340 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
10350 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10360 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
10370 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
10380 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
10390 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
103a0 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
103b0 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
103c0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
103d0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
103e0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
103f0 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
10400 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
10410 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
10420 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
10430 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
10440 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
10450 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10460 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
10470 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
10480 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
10490 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
104a0 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
104b0 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
104c0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
104d0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
104e0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
104f0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
10500 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63  ** No error chec
10510 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68  king is done. Th
10520 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74  e rational for t
10530 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73  his is that this
10540 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61   function .** ma
10550 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e  y be called even
10560 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   if the file doe
10570 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63  s not exist or c
10580 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e  ontain a header.
10590 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61   In .** these ca
105a0 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ses sqlite3OsRea
105b0 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  d() will return 
105c0 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69  an error, to whi
105d0 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a  ch the correct .
105e0 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74  ** response is t
105f0 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72  o zero the memor
10600 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63  y at pDest and c
10610 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c  ontinue.  A real
10620 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69   IO error .** wi
10630 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65  ll presumably re
10640 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65  cur and be picke
10650 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f  d up later (Todo
10660 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  : Think about th
10670 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  is)..*/.int sqli
10680 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
10690 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
106a0 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
106b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
106c0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
106d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
106e0 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
106f0 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20  .  if( MEMDB==0 
10700 29 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  ){.    disable_s
10710 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10720 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
10730 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
10740 66 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62  fd, 0);.    enab
10750 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10760 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f  errors();.    IO
10770 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
10780 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
10790 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
107a0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
107b0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
107c0 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  N);.    if( rc==
107d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
107e0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
107f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10800 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10810 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10820 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
10830 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
10840 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
10850 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
10860 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
10870 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
10880 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
10890 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
108a0 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
108b0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
108c0 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
108d0 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
108e0 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
108f0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
10900 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
10910 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
10920 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
10930 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
10940 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
10950 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
10960 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
10970 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
10980 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
10990 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
109a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
109b0 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   n;.  int rc;.  
109c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
109d0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
109e0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
109f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
10a00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
10a10 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e  Size>=0 ){.    n
10a20 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
10a30 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
10a40 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69    if( (rc = sqli
10a50 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
10a60 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d  ager->fd, &n))!=
10a70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10a80 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
10a90 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
10aa0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
10ab0 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
10ac0 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
10ad0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ize ){.      n =
10ae0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
10af0 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72       n /= pPager
10b00 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
10b10 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
10b20 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
10b30 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
10b40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
10b50 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
10b60 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42  f( n==(PENDING_B
10b70 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
10b80 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b  Size) ){.    n++
10b90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50  ;.  }.  if( n>pP
10ba0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
10bb0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
10bc0 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  no = n;.  }.  re
10bd0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e  turn n;.}...#ifn
10be0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10bf0 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43  MEMORYDB./*.** C
10c00 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79  lear a PgHistory
10c10 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63   block.*/.static
10c20 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f   void clearHisto
10c30 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48  ry(PgHistory *pH
10c40 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  ist){.  sqliteFr
10c50 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29  ee(pHist->pOrig)
10c60 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
10c70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
10c80 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
10c90 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
10ca0 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
10cb0 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
10cc0 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
10cd0 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
10ce0 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
10cf0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
10d00 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a  l(Pager*);../*.*
10d10 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
10d20 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
10d30 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20  n. Also set the 
10d40 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30  page number to 0
10d50 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
10d60 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
10d70 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79   not part of any
10d80 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69   hash chain. Thi
10d90 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
10da0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c  cause the.** sql
10db0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
10dc0 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  e() routine can 
10dd0 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20  leave a page in 
10de0 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65  the .** pNextFre
10df0 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74  e/pPrevFree list
10e00 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
10e10 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d  art of any hash-
10e20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
10e30 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68   void unlinkHash
10e40 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Chain(Pager *pPa
10e50 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
10e60 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  {.  if( pPg->pgn
10e70 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  o==0 ){.    asse
10e80 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
10e90 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50  sh==0 && pPg->pP
10ea0 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
10eb0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
10ec0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
10ed0 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  sh ){.    pPg->p
10ee0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
10ef0 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
10f00 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
10f10 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29  pPg->pPrevHash )
10f20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
10f30 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d  ager->aHash[pPg-
10f40 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
10f50 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20  >nHash-1)]!=pPg 
10f60 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
10f70 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
10f80 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
10f90 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
10fa0 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e  int h = pPg->pgn
10fb0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
10fc0 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65  sh-1);.    pPage
10fd0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
10fe0 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
10ff0 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
11000 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72  .    clearHistor
11010 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
11020 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
11030 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d   }.  pPg->pgno =
11040 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
11050 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
11060 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
11070 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
11080 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
11090 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
110a0 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
110b0 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
110c0 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
110d0 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
110e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
110f0 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
11100 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
11110 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
11120 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
11130 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
11140 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
11150 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
11160 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
11170 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
11180 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
11190 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
111a0 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
111b0 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
111c0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
111d0 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
111e0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
111f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
11200 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
11210 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
11220 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
11230 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
11240 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
11250 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
11260 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
11270 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
11280 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
11290 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
112a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
112b0 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
112c0 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
112d0 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
112e0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
112f0 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
11300 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
11310 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
11320 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11330 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
11340 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
11350 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11360 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
11370 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
11380 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
11390 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
113a0 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
113b0 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
113c0 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
113d0 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pPg);.}../*.** 
113e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
113f0 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
11400 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
11410 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73  a database.** is
11420 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f   truncated.  Dro
11430 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  p from the cache
11440 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
11450 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67   pgno is.** larg
11460 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
11470 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
11480 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a  referenced..**.*
11490 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
114a0 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
114b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
114c0 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
114d0 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65  Actually, at the
114e0 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
114f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
11500 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e  t would be.** an
11510 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61   error to have a
11520 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
11530 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68  .  But rather th
11540 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61  an delete.** tha
11550 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61  t page and guara
11560 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e  ntee a subsequen
11570 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73  t segfault, it s
11580 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74  eems better.** t
11590 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f  o zero it and ho
115a0 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72  pe that we error
115b0 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a   out sanely..*/.
115c0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
115d0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
115e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
115f0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
11600 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
11610 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
11620 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
11630 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
11640 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
11650 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
11660 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
11670 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
11680 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
11690 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
116a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
116b0 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
116c0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
116d0 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
116e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
116f0 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
11700 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
11710 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11720 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
11730 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54  xtAll;.      IOT
11740 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
11750 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
11760 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
11770 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
11780 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
11790 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
117a0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
117b0 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ;.      makeClea
117c0 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  n(pPg);.      sq
117d0 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
117e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
117f0 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
11800 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
11810 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
11820 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
11830 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11840 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
11850 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
11860 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
11870 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
11880 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
11890 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
118a0 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
118b0 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
118c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
118d0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
118e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
118f0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
11900 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
11910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11920 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11930 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11940 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
11950 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
11960 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
11970 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
11980 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
11990 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
119a0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
119b0 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
119c0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
119d0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
119e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
119f0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
11a00 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
11a10 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
11a20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
11a30 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
11a40 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
11a50 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
11a60 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
11a70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11a80 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
11a90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
11aa0 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20   || MEMDB );..  
11ab0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
11ac0 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
11ad0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11ae0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
11af0 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
11b00 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
11b10 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
11b20 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
11b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
11b40 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
11b50 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
11b60 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
11b70 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
11b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11b90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
11ba0 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
11bb0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
11bc0 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
11bd0 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
11be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11bf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11c00 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
11c10 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
11c20 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
11c30 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
11c40 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
11c50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11c60 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
11c70 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
11c80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11c90 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
11ca0 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  MEMDB );.  sqlit
11cb0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
11cc0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
11cd0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
11ce0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
11cf0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
11d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11d10 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
11d20 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
11d30 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
11d40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11d50 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
11d60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
11d70 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11d80 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
11d90 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
11da0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11db0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
11dc0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
11dd0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
11de0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11e00 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63  .  /* Get an exc
11e10 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
11e20 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
11e30 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a  re truncating. *
11e40 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
11e50 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
11e60 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
11e70 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
11e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11e90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
11ea0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
11eb0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50  ncate(pPager, nP
11ec0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
11ed0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
11ee0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
11ef0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
11f00 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
11f10 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
11f20 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
11f30 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
11f40 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
11f50 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
11f60 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
11f70 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
11f80 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
11f90 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
11fa0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
11fb0 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
11fc0 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
11fd0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
11fe0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
11ff0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
12000 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
12010 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
12020 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
12030 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
12040 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
12050 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
12060 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
12070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12080 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
12090 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
120a0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
120b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
120c0 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
120d0 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
120e0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
120f0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
12100 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
12110 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
12120 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
12130 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12140 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
12150 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20  pPager){.#ifdef 
12160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
12170 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
12180 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
12190 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73  cannot fail in s
121a0 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
121b0 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  () as one or mor
121c0 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a  e calls to .  **
121d0 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68   malloc() must h
121e0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
121f0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68   made by this th
12200 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67  read before it g
12210 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ets.  ** to this
12220 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61   point. This mea
12230 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74  ns the ThreadDat
12240 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  a must have been
12250 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61   allocated alrea
12260 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  dy.  ** so that 
12270 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
12280 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20  c can be set..  
12290 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  */.  ThreadData 
122a0 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54  *pTsd = sqlite3T
122b0 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61  hreadData();.  a
122c0 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29 3b  ssert( pPager );
122d0 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20  .  assert( pTsd 
122e0 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20  && pTsd->nAlloc 
122f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73  );.#endif..  dis
12300 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
12310 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50  o_errors();.  pP
12320 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
12330 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  0;.  pPager->exc
12340 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
12350 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
12360 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e  ager);.  pagerUn
12370 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
12380 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c  pPager);.  enabl
12390 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
123a0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
123b0 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
123c0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
123d0 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ger));.  IOTRACE
123e0 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
123f0 70 50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72  pPager)).  asser
12400 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12410 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  de || (pPager->j
12420 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26  ournalOpen==0 &&
12430 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
12440 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
12450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12460 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
12470 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
12480 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  ->jfd);.  }.  sq
12490 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
124a0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
124b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
124c0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
124d0 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
124e0 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20  er->stfd);.  }. 
124f0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
12500 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
12510 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
12520 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
12530 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
12540 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
12550 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
12560 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
12570 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
12580 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
12590 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  .  */..#ifdef SQ
125a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
125b0 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
125c0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
125d0 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e  ger from the lin
125e0 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
125f0 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a  rs starting at .
12600 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e    ** ThreadData.
12610 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79  pPager if memory
12620 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
12630 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  nabled..  */.  i
12640 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d  f( pPager==pTsd-
12650 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70  >pPager ){.    p
12660 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  Tsd->pPager = pP
12670 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
12680 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20  else{.    Pager 
12690 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70  *pTmp;.    for(p
126a0 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67  Tmp = pTsd->pPag
126b0 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21  er; pTmp->pNext!
126c0 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54  =pPager; pTmp=pT
126d0 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  mp->pNext){}.   
126e0 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70   pTmp->pNext = p
126f0 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
12700 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
12710 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  eFree(pPager->aH
12720 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ash);.  sqliteFr
12730 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
12740 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  pace);.  sqliteF
12750 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
12760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12770 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
12780 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
12790 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
127a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
127b0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
127c0 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
127d0 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73   data..*/.Pgno s
127e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
127f0 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29  umber(DbPage *p)
12800 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67  {.  return p->pg
12810 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
12820 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
12830 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
12840 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
12850 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
12860 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
12870 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
12880 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
12890 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
128a0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
128b0 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
128c0 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
128d0 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
128e0 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
128f0 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
12900 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
12910 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
12920 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
12930 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12940 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
12950 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
12960 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
12970 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
12980 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
12990 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
129a0 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
129b0 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
129c0 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
129d0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
129e0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
129f0 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
12a00 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
12a10 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
12a20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
12a30 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12a40 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
12a50 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
12a60 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
12a70 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
12a80 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
12a90 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
12aa0 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
12ab0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
12ac0 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
12ad0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
12ae0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
12af0 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
12b00 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
12b10 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
12b20 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
12b30 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
12b40 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
12b50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12b60 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
12b70 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
12b80 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
12b90 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
12ba0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
12bb0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
12bc0 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
12bd0 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
12be0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12bf0 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
12c00 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
12c10 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
12c20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
12c30 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
12c40 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
12c50 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
12c60 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
12c70 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
12c80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12c90 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
12ca0 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
12cb0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
12cc0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
12cd0 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
12ce0 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
12cf0 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
12d00 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
12d10 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
12d20 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
12d30 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
12d40 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
12d50 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
12d60 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
12d70 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
12d80 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
12d90 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
12da0 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
12db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12dc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
12dd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
12de0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
12df0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
12e00 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
12e10 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
12e20 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
12e30 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
12e40 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
12e50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
12e60 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  .  It is not saf
12e70 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
12e80 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
12e90 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74  e file until aft
12ea0 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  er.** the journa
12eb0 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  l has been synce
12ec0 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69  d.  If the origi
12ed0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  nal database is 
12ee0 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a  modified before.
12ef0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
12f00 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70  s synced and a p
12f10 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
12f20 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65  urs, the unsynce
12f30 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74  d journal.** dat
12f40 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20  a would be lost 
12f50 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20  and we would be 
12f60 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
12f70 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68  tely rollback th
12f80 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
12f90 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65  anges.  Database
12fa0 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c   corruption woul
12fb0 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20  d occur..** .** 
12fc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
12fd0 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52  o updates the nR
12fe0 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
12ff0 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
13000 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63  urnal..** (See c
13010 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  omments on the p
13020 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
13030 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
13040 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
13050 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73  on.).** If the s
13060 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c  ync mode is FULL
13070 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c  , two syncs will
13080 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74   occur.  First t
13090 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
130a0 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74  .** is synced, t
130b0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
130c0 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74  ld is updated, t
130d0 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e  hen a second syn
130e0 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
130f0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  For temporary da
13100 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e  tabases, we do n
13110 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72  ot care if we ar
13120 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
13130 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f  ck.** after a po
13140 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20  wer failure, so 
13150 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
13160 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13170 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
13180 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
13190 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
131a0 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
131b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
131c0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
131d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
131e0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
131f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13200 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20  ..  /* Sync the 
13210 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d  journal before m
13220 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69  odifying the mai
13230 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
13240 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20  (assuming there 
13250 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  is a journal and
13260 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
13270 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20  synced.).  */.  
13280 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
13290 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20  Sync ){.    if( 
132a0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
132b0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
132c0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
132d0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
132e0 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67  /* assert( !pPag
132f0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f  er->noSync ); //
13300 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65   noSync might be
13310 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e   set if synchron
13320 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  ous.      ** was
13330 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65   turned off afte
13340 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
13350 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20  n was started.  
13360 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23  Ticket #615 */.#
13370 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13380 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
13390 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
133a0 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e  Pager->nRec coun
133b0 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69  ter we are keepi
133c0 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20  ng agrees.      
133d0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52    ** with the nR
133e0 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
133f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
13400 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
13410 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13420 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20    i64 jSz;.     
13430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13440 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
13450 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20  ->jfd, &jSz);.  
13460 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
13470 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13480 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
13490 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
134a0 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a  =jSz );.      }.
134b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
134c0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
134d0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
134e0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
134f0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
13500 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
13510 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
13520 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
13530 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
13540 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
13550 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
13560 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
13570 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
13580 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
13590 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
135a0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
135b0 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
135c0 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ack. .        */
135d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
135e0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
135f0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
13600 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
13610 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
13620 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
13630 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
13640 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
13650 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
13660 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13670 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
13680 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
13690 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
136a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
136b0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
136c0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
136d0 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20  Pager->jfd,.    
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
13700 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
13710 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
13720 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
13730 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13740 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
13750 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
13760 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20  d\n", pPager,.  
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
13790 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
137a0 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a  rnalMagic), 4)).
137b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
137c0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
137d0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52  >jfd, pPager->nR
137e0 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
137f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13800 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ..        rc = s
13810 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
13820 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
13830 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
13840 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
13850 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13860 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52   }.      PAGERTR
13870 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
13880 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
13890 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
138a0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
138b0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
138c0 65 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20  er)).      rc = 
138d0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
138e0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
138f0 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
13900 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
13910 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13920 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13930 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
13940 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
13950 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
13960 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
13970 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
13980 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
13990 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
139a0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
139b0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
139c0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
139d0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
139e0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  0;.    }.    pPa
139f0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13a00 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  d = pPager->pFir
13a10 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  st;.  }..#ifndef
13a20 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
13a30 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
13a40 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  nc flag is clear
13a50 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e   then the PgHdr.
13a60 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c  needSync.  ** fl
13a70 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ag must also be 
13a80 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61  clear for all pa
13a90 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  ges.  Verify tha
13aa0 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61  t this.  ** inva
13ab0 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20  riant is true.. 
13ac0 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
13ad0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
13ae0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
13af0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
13b00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
13b10 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
13b20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
13b30 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
13b40 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d  tSynced==pPager-
13b50 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23  >pFirst );.  }.#
13b60 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
13b70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72  rc;.}../*.** Mer
13b80 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20  ge two lists of 
13b90 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20  pages connected 
13ba0 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e  by pDirty and in
13bb0 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20   pgno order..** 
13bc0 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69  Do not both fixi
13bd0 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74  ng the pPrevDirt
13be0 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  y pointers..*/.s
13bf0 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72  tatic PgHdr *mer
13c00 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  ge_pagelist(PgHd
13c10 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42  r *pA, PgHdr *pB
13c20 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c  ){.  PgHdr resul
13c30 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61  t, *pTail;.  pTa
13c40 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20  il = &result;.  
13c50 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20  while( pA && pB 
13c60 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  ){.    if( pA->p
13c70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a  gno<pB->pgno ){.
13c80 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69        pTail->pDi
13c90 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20  rty = pA;.      
13ca0 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20  pTail = pA;.    
13cb0 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74    pA = pA->pDirt
13cc0 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
13cd0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
13ce0 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54  y = pB;.      pT
13cf0 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  ail = pB;.      
13d00 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b  pB = pB->pDirty;
13d10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13d20 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pA ){.    pTail
13d30 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
13d40 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b   }else if( pB ){
13d50 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
13d60 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65  ty = pB;.  }else
13d70 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
13d80 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  rty = 0;.  }.  r
13d90 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69  eturn result.pDi
13da0 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  rty;.}../*.** So
13db0 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  rt the list of p
13dc0 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
13dd0 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e  g order by pgno.
13de0 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63    Pages are.** c
13df0 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
13e00 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68  ty pointers.  Th
13e10 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69  e pPrevDirty poi
13e20 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72  nters are.** cor
13e30 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73  rupted by this s
13e40 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ort..*/.#define 
13e50 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
13e60 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e  LOC 25.#define N
13e70 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20  _SORT_BUCKET    
13e80 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c     25.#ifdef SQL
13e90 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73  ITE_TEST.  int s
13ea0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
13eb0 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a  ort_bucket = 0;.
13ec0 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f    #undef N_SORT_
13ed0 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65  BUCKET.  #define
13ee0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c   N_SORT_BUCKET \
13ef0 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67  .   (sqlite3_pag
13f00 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
13f10 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e  ?sqlite3_pager_n
13f20 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53  _sort_bucket:N_S
13f30 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
13f40 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
13f50 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65  PgHdr *sort_page
13f60 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29  list(PgHdr *pIn)
13f70 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53  {.  PgHdr *a[N_S
13f80 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
13f90 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  ], *p;.  int i;.
13fa0 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73    memset(a, 0, s
13fb0 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69  izeof(a));.  whi
13fc0 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70  le( pIn ){.    p
13fd0 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20   = pIn;.    pIn 
13fe0 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
13ff0 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
14000 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e      for(i=0; i<N
14010 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20  _SORT_BUCKET-1; 
14020 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
14030 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  a[i]==0 ){.     
14040 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20     a[i] = p;.   
14050 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14070 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
14080 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
14090 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a        a[i] = 0;.
140a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
140b0 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f    if( i==N_SORT_
140c0 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20  BUCKET-1 ){.    
140d0 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54    /* Coverage: T
140e0 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72  o get here, ther
140f0 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28  e need to be 2^(
14100 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a  N_SORT_BUCKET) .
14110 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74        ** element
14120 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
14130 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73  ist. This is pos
14140 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61  sible, but impra
14150 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  ctical..      **
14160 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69   Testing this li
14170 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20  ne is the point 
14180 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  of global variab
14190 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  le.      ** sqli
141a0 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
141b0 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a  _bucket..      *
141c0 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d  /.      a[i] = m
141d0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
141e0 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  i], p);.    }.  
141f0 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20  }.  p = a[0];.  
14200 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52  for(i=1; i<N_SOR
14210 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a  T_BUCKET; i++){.
14220 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
14230 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b  gelist(p, a[i]);
14240 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
14250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
14260 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
14270 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
14280 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
14290 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
142a0 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
142b0 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
142c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
142d0 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
142e0 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
142f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14300 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
14310 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
14320 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
14330 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
14340 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14360 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
14370 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
14380 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
14390 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
143a0 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
143b0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
143c0 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
143d0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
143e0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
143f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
14400 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
14410 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
14420 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
14430 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
14440 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
14450 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
14460 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
14470 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
14480 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
14490 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
144a0 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
144b0 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
144c0 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
144d0 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
144e0 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
144f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
14500 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
14510 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
14520 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
14530 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
14540 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
14550 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
14560 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
14570 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
14580 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
14590 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
145a0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
145b0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
145c0 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
145d0 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
145e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
145f0 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
14600 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
14610 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
14620 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
14630 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
14640 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
14650 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
14660 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
14670 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
14680 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
14690 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
146a0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
146b0 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
146c0 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
146d0 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
146e0 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
146f0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
14700 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
14710 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
14720 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
14730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14740 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
14750 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61   pList = sort_pa
14760 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20  gelist(pList);. 
14770 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
14780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
14790 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  st->dirty );.   
147a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
147b0 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
147c0 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
147d0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
147e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
147f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
14810 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
14820 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
14830 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
14840 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
14850 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
14860 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
14870 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
14880 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
14890 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
148a0 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
148b0 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
148c0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
148d0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
148e0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
148f0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
14900 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
14910 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
14920 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
14930 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
14940 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50  Data = CODEC2(pP
14950 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
14960 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
14970 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
14980 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
14990 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
149a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
149b0 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
149c0 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  o);.      IOTRAC
149d0 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
149e0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
149f0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
14a00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
14a10 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
14a20 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
14a30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14a40 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
14a50 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
14a60 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  b_count);.      
14a70 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
14a80 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
14a90 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
14aa0 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
14ab0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
14ac0 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
14ad0 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
14ae0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
14af0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
14b00 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
14b10 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
14b20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
14b30 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
14b40 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
14b50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
14b60 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
14b70 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
14b80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c  eturn rc;.    pL
14b90 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  ist->dirty = 0;.
14ba0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
14bb0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c  ECK_PAGES.    pL
14bc0 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  ist->pageHash = 
14bd0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
14be0 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  List);.#endif.  
14bf0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
14c00 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
14c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
14c30 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
14c40 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
14c50 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
14c60 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
14c70 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
14c80 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
14c90 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
14ca0 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
14cb0 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
14cc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
14cd0 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
14ce0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
14cf0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
14d00 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44  eturn pPager->pD
14d10 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
14d20 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
14d30 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
14d40 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
14d50 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
14d60 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
14d70 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
14d80 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
14d90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
14da0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
14db0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
14dc0 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
14dd0 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
14de0 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
14df0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
14e00 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
14e10 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
14e20 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
14e30 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
14e40 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
14e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14e60 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
14e70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14e80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65  if( !pPager->use
14e90 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  Journal ) return
14ea0 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
14eb0 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
14ec0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
14ed0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
14ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
14ef0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
14f00 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
14f10 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d) ){.    return
14f20 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
14f30 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
14f40 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
14f50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
14f60 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
14f70 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74  ournal);.    ret
14f80 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
14f90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14fa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
14fb0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
14fc0 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
14fd0 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e  can be recycled.
14fe0 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
14ff0 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20  tine may return 
15000 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
15010 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c  LITE_FULL or SQL
15020 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64  ITE_OK. It .** d
15030 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  oes not set the 
15040 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
15050 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
15060 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65  tic int pager_re
15070 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61  cycle(Pager *pPa
15080 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c  ger, int syncOk,
15090 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a   PgHdr **ppPg){.
150a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
150b0 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73  *ppPg = 0;..  as
150c0 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a 0a 20  sert(!MEMDB);.. 
150d0 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
150e0 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
150f0 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
15100 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
15110 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
15120 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
15130 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
15140 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50  .  */.  pPg = pP
15150 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
15160 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ed;..  /* If we 
15170 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
15180 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
15190 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
151a0 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74  sync().  ** on t
151b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
151c0 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
151d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
151e0 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72  is is a.  ** ver
151f0 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
15200 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
15210 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
15220 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
15230 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68  ** it can't be h
15240 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  elped..  */.  if
15250 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67  ( pPg==0 && pPag
15260 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79  er->pFirst && sy
15270 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b  ncOk && !MEMDB){
15280 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79  .    int rc = sy
15290 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
152a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
152b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
152c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
152d0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
152e0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ync ){.      /* 
152f0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
15300 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65  mode, write a ne
15310 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  w journal header
15320 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
15330 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
15340 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
15350 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69   avoid ever modi
15360 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a  fying a journal.
15370 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20        ** header 
15380 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
15390 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
153a0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
153b0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  ave.      ** alr
153c0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
153d0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
153e0 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
153f0 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a  eader is.      *
15400 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74  * trashed when t
15410 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
15420 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20   updated)..     
15430 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
15440 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
15450 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15460 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30  ->journalOff > 0
15470 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15480 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
15490 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
154a0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
154b0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
154c0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
154d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
154e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
154f0 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67  }.    pPg = pPag
15500 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
15510 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
15520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15530 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  E_OK;.  }..  ass
15540 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
15550 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
15560 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
15570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
15580 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
15590 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   */.  if( pPg->d
155a0 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  irty ){.    int 
155b0 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
155c0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
155d0 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61   );.    makeClea
155e0 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
155f0 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20  >dirty = 1;.    
15600 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
15610 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
15620 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20  write_pagelist( 
15630 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20 72  pPg );.    if( r
15640 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15650 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15660 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
15670 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d  ert( pPg->dirty=
15680 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
15690 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72  he page we are r
156a0 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b  ecycling is mark
156b0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
156c0 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  back, then.  ** 
156d0 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61  set the global a
156e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
156f0 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69  ag, thus disabli
15700 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  ng the.  ** sqli
15710 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
15720 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
15730 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
15740 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
15750 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73  tion..  ** It is
15760 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f   necessary to do
15770 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68   this because th
15780 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  e page marked al
15790 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a  waysRollback.  *
157a0 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61  * might be reloa
157b0 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74  ded at a later t
157c0 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20  ime but at that 
157d0 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72  point we won't r
157e0 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61  emember.  ** tha
157f0 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
15800 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
15810 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
15820 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
15830 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
15840 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
15850 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
15860 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
15870 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
15880 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  k ){.    IOTRACE
15890 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41  (("ALWAYS_ROLLBA
158a0 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
158b0 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  )).    pPager->a
158c0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
158d0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  1;.  }..  /* Unl
158e0 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
158f0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
15900 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
15910 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e   table.  */.  un
15920 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
15930 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
15940 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50  no==0 );..  *ppP
15950 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72  g = pPg;.  retur
15960 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15970 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15980 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
15990 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75   free superfluou
159a0 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  s dynamically al
159b0 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
159c0 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61  * held by the pa
159d0 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f  ger system. Memo
159e0 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79  ry in use by any
159f0 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c   SQLite pager al
15a00 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
15a10 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
15a20 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46 72   may be sqliteFr
15a30 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52  ee()ed..**.** nR
15a40 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  eq is the number
15a50 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
15a60 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e  ory required. On
15a70 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73  ce this much has
15a80 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65  .** been release
15a90 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  d, the function 
15aa0 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61 74  returns. A negat
15ab0 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e 52  ive value for nR
15ac0 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65  eq means.** free
15ad0 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
15ae0 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65  as possible. The
15af0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
15b00 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
15b10 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f  r .** of bytes o
15b20 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65  f memory release
15b30 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  d..*/.#if define
15b40 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
15b50 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
15b60 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
15b70 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
15b80 4f 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  O).int sqlite3Pa
15b90 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79  gerReleaseMemory
15ba0 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f  (int nReq){.  co
15bb0 6e 73 74 20 54 68 72 65 61 64 44 61 74 61 20 2a  nst ThreadData *
15bc0 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33  pTsdro = sqlite3
15bd0 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
15be0 6c 79 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 6c  ly();.  int nRel
15bf0 65 61 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74  eased = 0;.  int
15c00 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   i;..  /* If the
15c10 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
15c20 78 20 69 73 20 68 65 6c 64 2c 20 74 68 69 73 20  x is held, this 
15c30 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d  subroutine becom
15c40 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20  es a.  ** o-op; 
15c50 7a 65 72 6f 20 62 79 74 65 73 20 6f 66 20 6d 65  zero bytes of me
15c60 6d 6f 72 79 20 61 72 65 20 66 72 65 65 64 2e 20  mory are freed. 
15c70 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
15c80 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  .  ** some of th
15c90 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62  e code invoked b
15ca0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
15cb0 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72  may also.  ** tr
15cc0 79 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  y to obtain the 
15cd0 6d 75 74 65 78 2c 20 72 65 73 75 6c 74 69 6e 67  mutex, resulting
15ce0 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a   in a deadlock..
15cf0 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
15d00 65 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29  e3OsInMutex(0) )
15d10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
15d20 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d    }..  /* Outerm
15d30 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f  ost loop runs fo
15d40 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74  r at most two it
15d50 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20  erations. First 
15d60 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a  iteration we.  *
15d70 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65  * try to find me
15d80 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62 65  mory that can be
15d90 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75   released withou
15da0 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  t calling fsync(
15db0 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69  ). Second.  ** i
15dc0 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20  teration (which 
15dd0 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65  only runs if the
15de0 20 66 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f   first failed to
15df0 20 66 72 65 65 20 6e 52 65 71 20 62 79 74 65 73   free nReq bytes
15e00 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29   of.  ** memory)
15e10 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f   is permitted to
15e20 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54   call fsync(). T
15e30 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65  his is of course
15e40 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a   much more .  **
15e50 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f   expensive..  */
15e60 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31  .  for(i=0; i<=1
15e70 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20  ; i++){..    /* 
15e80 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
15e90 20 74 68 65 20 53 51 4c 69 74 65 20 70 61 67 65   the SQLite page
15ea0 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  rs opened by the
15eb0 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
15ec0 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 20 2a 70   */.    Pager *p
15ed0 50 61 67 65 72 20 3d 20 70 54 73 64 72 6f 2d 3e  Pager = pTsdro->
15ee0 70 50 61 67 65 72 3b 0a 20 20 20 20 66 6f 72 28  pPager;.    for(
15ef0 20 3b 20 70 50 61 67 65 72 20 26 26 20 28 6e 52   ; pPager && (nR
15f00 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65  eq<0 || nRelease
15f10 64 3c 6e 52 65 71 29 3b 20 70 50 61 67 65 72 3d  d<nReq); pPager=
15f20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  pPager->pNext){.
15f30 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
15f40 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  ;.      int rc;.
15f50 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
15f60 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
15f70 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
15f80 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
15f90 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66   pager, try to f
15fa0 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65  ree as many page
15fb0 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77  s as possible (w
15fc0 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a  ithout .      **
15fd0 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29   calling fsync()
15fe0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
15ff0 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
16000 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
16010 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29   .      ** loop)
16020 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16030 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f   while( SQLITE_O
16040 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72  K==(rc = pager_r
16050 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 69  ecycle(pPager, i
16060 2c 20 26 70 50 67 29 29 20 26 26 20 70 50 67 29  , &pPg)) && pPg)
16070 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65   {.        /* We
16080 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65  've found a page
16090 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69   to free. At thi
160a0 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65  s point the page
160b0 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20   has been .     
160c0 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72     ** removed fr
160d0 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68  om the page hash
160e0 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73  -table, free-lis
160f0 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73  t and synced-lis
16100 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70  t .        ** (p
16110 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74  FirstSynced). It
16120 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65   is still in the
16130 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c   all pages (pAll
16140 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  ) list. .       
16150 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
16160 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
16170 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
16180 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
16190 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74  ** Todo: Check t
161a0 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c  he Pager.pStmt l
161b0 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ist to make sure
161c0 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20   this is Ok. It 
161d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
161e0 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a  ably is though..
161f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16200 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a     PgHdr *pTmp;.
16210 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16220 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69  pPg );.        i
16230 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
16240 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
16250 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
16260 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
16270 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16280 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 70            for( p
16290 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  Tmp=pPager->pAll
162a0 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  ; pTmp->pNextAll
162b0 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70  !=pPg; pTmp=pTmp
162c0 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20  ->pNextAll ){}. 
162d0 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70           pTmp->p
162e0 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  NextAll = pPg->p
162f0 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
16300 20 7d 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65   }.        nRele
16310 61 73 65 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c  ased += sqliteAl
16320 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a 20 20  locSize(pPg);.  
16330 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
16340 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
16350 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
16360 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  no));.        PA
16370 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
16380 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
16390 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  unt);.        sq
163a0 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
163b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
163c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
163d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  ){.        /* An
163e0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77   error occured w
163f0 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
16400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16410 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  le or .        *
16420 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
16430 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
16440 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
16450 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
16460 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65          ** calle
16470 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
16480 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74  on. Instead, set
16490 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   the Pager.errCo
164a0 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20  de variable..   
164b0 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f       ** The erro
164c0 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
164d0 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28  ed to the user (
164e0 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65  or users, in the
164f0 20 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a   case .        *
16500 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
16510 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
16520 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
16530 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
16540 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
16550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16560 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
16570 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53  E_IOERR || rc==S
16580 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20  QLITE_FULL );.  
16590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
165a0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
165b0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
165c0 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
165d0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
165e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
165f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c  }..  return nRel
16600 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20  eased;.}.#endif 
16610 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
16620 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
16630 4e 54 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d  NT && !SQLITE_OM
16640 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 0a 2f 2a  IT_DISKIO */../*
16650 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
16660 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67  tent of page pPg
16670 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
16680 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
16690 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
166a0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
166b0 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50  r, PgHdr *pPg, P
166c0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
166d0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 4d   rc;.  assert( M
166e0 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 72 63 20  EMDB==0 );.  rc 
166f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
16700 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
16710 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
16720 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
16730 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16740 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
16750 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
16760 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f  r->fd, PGHDR_TO_
16770 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20  DATA(pPg),.     
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
167a0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 50 41  eSize);.  }.  PA
167b0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
167c0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
167d0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
167e0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
167f0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
16800 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
16810 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
16820 50 41 47 45 52 54 52 41 43 45 33 28 22 46 45 54  PAGERTRACE3("FET
16830 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CH %d page %d\n"
16840 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
16850 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
16860 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
16870 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
16880 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16890 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f  &((u8*)PGHDR_TO_
168a0 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a  DATA(pPg))[24],.
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
168e0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
168f0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20  ileVers));.  }. 
16900 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
16910 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16920 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  g), pPg->pgno, 3
16930 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16940 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
16950 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16960 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
16970 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75  shared lock requ
16980 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64  ired before.** d
16990 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20  ata may be read 
169a0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
169b0 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61  ache. If the sha
169c0 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72  red lock has alr
169d0 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74  eady.** been obt
169e0 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
169f0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
16a00 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65  .**.** Immediate
16a10 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
16a20 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ng the shared lo
16a30 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ck (if required)
16a40 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
16a50 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ** checks for a 
16a60 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
16a70 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  . If one is foun
16a80 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  d, an emergency 
16a90 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70  rollback.** is p
16aa0 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61  erformed immedia
16ab0 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
16ac0 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c  int pagerSharedL
16ad0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
16ae0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
16af0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
16b00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
16b10 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
16b20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
16b30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
16b40 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
16b50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
16b60 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
16b70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16b80 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
16b90 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
16ba0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
16bb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16bd0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
16be0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16bf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16c00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16c10 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
16c20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
16c30 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
16c40 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
16c50 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
16c60 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
16c70 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
16c80 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16c90 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
16ca0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
16cb0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
16cc0 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  leted..      */.
16cd0 20 20 20 20 20 20 69 66 28 20 68 61 73 48 6f 74        if( hasHot
16ce0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20  Journal(pPager) 
16cf0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ){.        /* Ge
16d00 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
16d10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16d20 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
16d30 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
16d40 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
16d50 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
16d60 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
16d70 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
16d80 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
16d90 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
16da0 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
16db0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
16dc0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
16dd0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
16de0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
16df0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
16e00 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
16e10 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
16e20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
16e30 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
16e40 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
16e50 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
16e60 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  g it .        **
16e70 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
16e80 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  * .        ** Be
16e90 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
16ea0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
16eb0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
16ec0 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
16ed0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
16ee0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
16ef0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
16f00 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
16f10 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   to.        ** o
16f20 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
16f30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
16f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16f50 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
16f60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16f70 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
16f80 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
16f90 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
16fa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
16fc0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
16fd0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
16fe0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
16ff0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
17000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17010 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
17020 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
17030 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
17040 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
17050 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
17060 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
17070 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20  BUSY if.        
17080 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
17090 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
170a0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
170b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
170c0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
170d0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  le does not need
170e0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74   to be locked it
170f0 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20  self.  The.     
17100 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
17110 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
17120 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
17130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
17140 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  olds.        ** 
17150 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
17160 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
17170 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
17180 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
17190 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
171a0 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
171b0 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
171c0 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ime..        **.
171d0 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
171e0 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
171f0 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
17200 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
17210 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63  .** exclusive-ac
17220 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
17230 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
17240 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
17250 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  and.        ** p
17260 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
17270 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
17280 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
17290 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
172a0 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
172b0 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
172c0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
172d0 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
172e0 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
172f0 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
17300 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
17310 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
17320 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
17330 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
17340 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
17350 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
17360 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
17370 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20 20  int ro;.        
17380 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
17390 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
173a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
173b0 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
173c0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rite(pPager->zJo
173d0 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
173e0 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20  jfd, &ro);.     
173f0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
17400 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
17410 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 20  ager->jfd );.   
17420 20 20 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b         if( ro ){
17430 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
17440 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
17450 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
17460 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
17470 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
17480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17490 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
174a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
174b0 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
174c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
174d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
174e0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
174f0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
17500 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
17510 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
17520 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
17530 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
17540 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17550 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
17560 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
17570 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  er = 0;.        
17580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
17590 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20  dr = 0;. .      
175a0 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
175b0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
175c0 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
175d0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
175e0 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61         ** lock a
175f0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
17600 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
17610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
17620 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
17630 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
17640 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17660 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
17670 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
17680 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
17690 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
176a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
176b0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
176c0 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
176d0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
176e0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
176f0 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
17700 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
17710 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
17720 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
17730 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68         /* The sh
17740 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
17750 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
17760 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17770 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a   file.        **
17780 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
17790 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20  lready pages in 
177a0 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20  the cache (from 
177b0 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
177c0 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
177d0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
177e0 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
177f0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
17800 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62          ** has b
17810 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49  een modified.  I
17820 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
17830 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73  as changed, flus
17840 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  h the.        **
17850 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20   cache..        
17860 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61  **.        ** Da
17870 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
17880 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
17890 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
178a0 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
178b0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
178c0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
178d0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
178e0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
178f0 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
17900 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
17910 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
17920 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
17930 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
17940 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79       ** other by
17950 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f  tes change rando
17960 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69  mly with each fi
17970 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20  le change when. 
17980 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65         ** a code
17990 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
179a0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
179b0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
179c0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
179d0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
179e0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
179f0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65  e .        ** de
17a00 74 65 63 68 65 64 2e 20 20 54 68 65 20 63 68 61  teched.  The cha
17a10 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
17a20 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
17a30 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
17a40 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
17a50 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
17a60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17a70 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
17a80 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
17a90 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
17aa0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
17ab0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
17ac0 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  r);..        if(
17ad0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17af0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
17b00 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Code;.        }.
17b10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
17b20 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
17b30 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
17b40 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
17b50 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
17b60 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
17b70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
17b80 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
17b90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 32 34 29  (pPager->fd, 24)
17ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17bb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
17bd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
17be0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
17bf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
17c00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
17c10 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
17c20 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
17c30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
17c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17c50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17c60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
17c70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17c80 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
17c90 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
17ca0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
17cb0 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  s));.        }..
17cc0 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63          if( memc
17cd0 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
17ce0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
17cf0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
17d00 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
17d10 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
17d20 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
17d30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17d40 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
17d50 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
17d60 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
17d70 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48  >state<=PAGER_SH
17d80 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
17d90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
17da0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
17db0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
17dc0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
17dd0 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  D;.    }.  }..  
17de0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17df0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50  .** Allocate a P
17e00 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45  gHdr object.   E
17e10 69 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e  ither create a n
17e20 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a  ew one or reuse.
17e30 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f  ** an existing o
17e40 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f  ne that is not o
17e50 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e  therwise in use.
17e60 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48  .**.** A new PgH
17e70 64 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20  dr structure is 
17e80 63 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f  created if any o
17e90 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17ea0 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a  are.** true:.**.
17eb0 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
17ec0 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64  ave not exceeded
17ed0 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   our maximum all
17ee0 6f 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a  ocated cache siz
17ef0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73  e.**          as
17f00 20 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41   set by the "PRA
17f10 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20  GMA cache_size" 
17f20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
17f30 20 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72     (2)  There ar
17f40 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64  e no unused PgHd
17f50 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61  r objects availa
17f60 62 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  ble at this time
17f70 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20  ..**.**     (3) 
17f80 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   This is an in-m
17f90 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
17fa0 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54  **.**     (4)  T
17fb0 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64  here are no PgHd
17fc0 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64  r objects that d
17fd0 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  o not require a 
17fe0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
17ff0 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e      file sync an
18000 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20  d a sync of the 
18010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18020 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
18030 20 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64        prohibited
18040 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
18050 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  e, reuse an exis
18060 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20  ting PgHdr.  In 
18070 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75  other words, reu
18080 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  se an.** existin
18090 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f  g PgHdr if all o
180a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
180b0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
180c0 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
180d0 20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65   reached or exce
180e0 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d  eded the maximum
180f0 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20   cache size.**  
18100 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20          allowed 
18110 62 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  by "PRAGMA cache
18120 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  _size"..**.**   
18130 20 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20    (2)  There is 
18140 61 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c  a PgHdr availabl
18150 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52  e with PgHdr->nR
18160 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ef==0.**.**     
18170 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20  (3)  We are not 
18180 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  in an in-memory 
18190 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20  database.**.**  
181a0 20 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74     (4)  Either t
181b0 68 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c  here is an avail
181c0 61 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20  able PgHdr that 
181d0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  does not need.**
181e0 20 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20            to be 
181f0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f  synced to disk o
18200 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63  r else disk sync
18210 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ing is currently
18220 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
18230 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owed..*/.static 
18240 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74  int pagerAllocat
18250 65 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  ePage(Pager *pPa
18260 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  ger, PgHdr **ppP
18270 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
18280 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
18290 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 43 72  r *pPg;..  /* Cr
182a0 65 61 74 65 20 61 20 6e 65 77 20 50 67 48 64 72  eate a new PgHdr
182b0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   if any of the f
182c0 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64  our conditions d
182d0 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f  efined .  ** abo
182e0 76 65 20 69 73 20 6d 65 74 3a 20 2a 2f 0a 20 20  ve is met: */.  
182f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
18300 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
18310 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  .   || pPager->p
18320 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20  First==0 .   || 
18330 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61  MEMDB.   || (pPa
18340 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
18350 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
18360 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a  doNotSync).  ){.
18370 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18380 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
18390 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61  Hash ){.      pa
183a0 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
183b0 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
183c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
183d0 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a  Hash<256 ? 256 :
183e0 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32   pPager->nHash*2
183f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
18400 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b  ger->nHash==0 ){
18410 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
18420 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18430 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
18440 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
18450 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
18460 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Pg = sqliteMallo
18470 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50  cRaw( sizeof(*pP
18480 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  g) + pPager->pag
18490 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  eSize.          
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184b0 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
184c0 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
184d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d               + M
184f0 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
18500 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 69 66  story) );.    if
18510 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
18520 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18530 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
18540 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
18550 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
18560 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
18570 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
18580 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
18590 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
185a0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
185b0 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ger), 0, sizeof(
185c0 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20  PgHistory));.   
185d0 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
185e0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
185f0 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d   pPg->pNextAll =
18600 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20   pPager->pAll;. 
18610 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
18620 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65  = pPg;.    pPage
18630 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65  r->nPage++;.  }e
18640 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79  lse{.    /* Recy
18650 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  cle an existing 
18660 70 61 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f  page with a zero
18670 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20   ref-count. */. 
18680 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
18690 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c  cycle(pPager, 1,
186a0 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20   &pPg);.    if( 
186b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
186c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
186d0 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a  r_allocate_out;.
186e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
186f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18700 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
18710 20 20 20 20 61 73 73 65 72 74 28 70 50 67 29 3b      assert(pPg);
18720 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70  .  }.  *ppPg = p
18730 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63  Pg;..pager_alloc
18740 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72  ate_out:.  retur
18750 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
18760 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
18770 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
18780 20 61 20 70 61 67 65 2e 20 20 49 66 20 74 68 65   a page.  If the
18790 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65   page was.** pre
187a0 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64  viously acquired
187b0 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
187c0 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  =1, then the con
187d0 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74  tent was.** just
187e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
187f0 7a 65 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66  zeros instead of
18800 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
18810 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f   disk..** But no
18820 77 20 77 65 20 6e 65 65 64 20 74 68 65 20 72 65  w we need the re
18830 61 6c 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64  al data off of d
18840 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75  isk.  So make su
18850 72 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74  re we.** have it
18860 2e 20 20 52 65 61 64 20 69 74 20 69 6e 20 69 66  .  Read it in if
18870 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
18880 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73  it already..*/.s
18890 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
188a0 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64  get_content(PgHd
188b0 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
188c0 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a  Pg->needRead ){.
188d0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65 61      int rc = rea
188e0 64 44 62 50 61 67 65 28 70 50 67 2d 3e 70 50 61  dDbPage(pPg->pPa
188f0 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70  ger, pPg, pPg->p
18900 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
18910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18920 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
18930 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ad = 0;.    }els
18940 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
18950 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
18960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
18980 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
18990 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
189a0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
189b0 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
189c0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
189d0 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
189e0 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
189f0 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
18a00 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
18a10 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eleased..**.** T
18a20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
18a30 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e  s for any page n
18a40 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
18a50 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61  an 0.  If the da
18a60 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
18a70 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
18a80 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
18a90 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61  e, then no actua
18aa0 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f  l disk.** read o
18ab0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65  ccurs and the me
18ac0 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
18ad0 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  e page is initia
18ae0 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20  lized to.** all 
18af0 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72  zeros.  The extr
18b00 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
18b10 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
18b20 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ays initialized.
18b30 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ** to zeros the 
18b40 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
18b50 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
18b60 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
18b70 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
18b80 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
18b90 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
18ba0 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
18bb0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
18bc0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18bd0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
18be0 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
18bf0 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
18c00 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
18c10 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
18c20 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
18c30 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
18c40 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
18c50 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
18c60 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
18c70 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
18c80 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
18c90 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
18ca0 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
18cb0 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
18cc0 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
18cd0 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
18ce0 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
18cf0 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
18d00 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
18d10 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
18d20 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
18d30 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
18d40 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
18d50 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
18d60 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
18d70 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
18d80 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
18d90 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
18da0 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
18db0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
18dc0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
18dd0 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
18de0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
18df0 61 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  are actually rea
18e00 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
18e10 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
18e20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
18e30 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
18e40 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
18e50 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
18e60 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
18e70 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20  e, so do not do 
18e80 61 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75  a disk read.  Ju
18e90 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a  st fill in the.*
18ea0 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  * page content w
18eb0 69 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20  ith zeros.  But 
18ec0 6d 61 72 6b 20 74 68 65 20 66 61 63 74 20 74 68  mark the fact th
18ed0 61 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  at we have not r
18ee0 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ead the.** conte
18ef0 6e 74 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  nt by setting th
18f00 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64  e PgHdr.needRead
18f10 20 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e   flag.  Later on
18f20 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33  , if .** sqlite3
18f30 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
18f40 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70  called on this p
18f50 61 67 65 20 6f 72 20 69 66 20 74 68 69 73 20 72  age or if this r
18f60 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c  outine is.** cal
18f70 6c 65 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e  led again with n
18f80 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61  oContent==0, tha
18f90 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
18fa0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64   content is need
18fb0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69  ed.** and the di
18fc0 73 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  sk read should o
18fd0 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
18fe0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
18ff0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
19000 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
19010 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
19020 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
19030 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
19040 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
19050 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
19060 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
19070 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
19080 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
19090 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
190a0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
190b0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
190c0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
190d0 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
190e0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
190f0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50  f true */.){.  P
19100 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
19110 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
19120 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19130 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70  AGER_UNLOCK || p
19140 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
19150 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f   pgno==1 );..  /
19160 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
19170 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
19180 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
19190 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
191a0 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
191b0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
191c0 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
191d0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
191e0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
191f0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
19200 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
19210 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
19220 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
19230 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19240 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
19250 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
19260 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
19270 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
19280 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
19290 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
192a0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
192b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
192c0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
192d0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
192e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
192f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
19300 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
19310 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
19320 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
19330 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
19340 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
19350 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
19360 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
19370 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
19380 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
19390 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
193a0 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
193b0 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
193c0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
193d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
193e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
193f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19400 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
19410 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
19420 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
19430 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
19440 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  );.  if( pPg==0 
19450 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
19460 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
19470 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
19480 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
19490 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20  t nMax;.    int 
194a0 68 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  h;.    PAGER_INC
194b0 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
194c0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
194d0 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61  AllocatePage(pPa
194e0 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20  ger, &pPg);.    
194f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19500 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
19510 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
19520 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
19530 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  o;.    assert( !
19540 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50  MEMDB || pgno>pP
19550 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
19560 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
19570 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
19580 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
19590 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
195a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
195b0 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
195c0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
195d0 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73  no/8);.      ass
195e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
195f0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
19600 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
19610 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
19620 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
19630 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
19640 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
19650 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
19660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
19670 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
19680 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
19690 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
196a0 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28  ..    makeClean(
196b0 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e  pPg);.    pPg->n
196c0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
196d0 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20  INFO(pPg);..    
196e0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
196f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19700 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20  nExtra>0 ){.    
19710 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
19720 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
19730 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
19740 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a  >nExtra);.    }.
19750 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74      nMax = sqlit
19760 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
19770 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
19780 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
19790 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
197a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
197b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50  );.      rc = pP
197c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
197d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
197e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
197f0 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20  pulate the page 
19800 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65  with data, eithe
19810 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f  r by reading fro
19820 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  m the database. 
19830 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62     ** file, or b
19840 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  y setting the en
19850 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72  tire page to zer
19860 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
19870 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  ( nMax<(int)pgno
19880 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f   || MEMDB || (no
19890 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
198a0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
198b0 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ck) ){.      if(
198c0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
198d0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
198e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
198f0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
19900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
19910 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
19920 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
19930 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
19940 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19950 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  );.      pPg->ne
19960 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e 74 65  edRead = noConte
19970 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61  nt && !pPager->a
19980 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20  lwaysRollback;. 
19990 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
199a0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
199b0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
199c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
199d0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
199e0 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
199f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
19a10 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
19a20 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
19a30 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
19a40 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
19a50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
19a60 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
19a70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
19a80 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65       pPg->needRe
19a90 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ad = 0;.    }.. 
19aa0 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70     /* Link the p
19ab0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
19ac0 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
19ad0 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28      h = pgno & (
19ae0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
19af0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
19b00 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  no!=0 );.    pPg
19b10 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
19b20 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
19b30 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
19b40 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
19b50 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
19b60 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
19b70 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
19b80 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
19b90 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
19ba0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
19bb0 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
19bc0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19bd0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
19be0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
19bf0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
19c00 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
19c10 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
19c20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
19c30 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
19c40 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  che. */.    asse
19c50 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  rt(pPager->nRef>
19c60 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20  0 || pgno==1);. 
19c70 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
19c80 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
19c90 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20   if( !noContent 
19ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
19cb0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
19cc0 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
19cd0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
19ce0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
19cf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 5f  .    }.    page_
19d00 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
19d10 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
19d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19d30 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
19d40 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
19d50 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
19d60 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
19d70 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
19d80 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
19d90 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
19da0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
19db0 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
19dc0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
19dd0 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
19de0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
19df0 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
19e00 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
19e10 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
19e20 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
19e30 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
19e40 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
19e50 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
19e60 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
19e70 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
19e80 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
19e90 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
19ea0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
19eb0 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19ec0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
19ed0 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
19ee0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
19ef0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
19f00 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
19f10 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
19f20 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
19f30 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
19f40 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
19f50 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
19f60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
19f70 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  o!=0 );..  if( p
19f80 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
19f90 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
19fa0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
19fb0 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65  r->pAll || pPage
19fc0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
19fd0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   );.    return 0
19fe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
19ff0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
1a000 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
1a010 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
1a020 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1a030 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
1a040 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1a050 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
1a060 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1a070 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1a080 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
1a090 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
1a0a0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  page..**.** If t
1a0b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
1a0c0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
1a0d0 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
1a0e0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
1a0f0 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
1a100 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
1a110 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
1a120 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
1a130 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
1a140 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1a150 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
1a160 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1a170 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
1a180 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1a190 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70  rUnref(DbPage *p
1a1a0 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  Pg){..  /* Decre
1a1b0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
1a1c0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
1a1d0 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61 73  s page.  */.  as
1a1e0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
1a1f0 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
1a200 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
1a210 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  g);..  CHECK_PAG
1a220 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  E(pPg);..  /* Wh
1a230 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
1a240 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
1a250 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
1a260 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
1a270 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
1a280 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
1a290 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
1a2a0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
1a2b0 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
1a2c0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67  pPager;.    pPag
1a2d0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1a2e0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1a2f0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Free = 0;.    pP
1a300 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  g->pPrevFree = p
1a310 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20  Pager->pLast;.  
1a320 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
1a330 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
1a340 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
1a350 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1a360 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
1a370 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73   = pPg;.    }els
1a380 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
1a390 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
1a3a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
1a3b0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26  ->needSync==0 &&
1a3c0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
1a3d0 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ynced==0 ){.    
1a3e0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
1a3f0 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
1a400 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
1a410 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
1a420 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1a430 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67  >xDestructor(pPg
1a440 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1a450 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
1a460 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
1a470 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
1a480 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
1a490 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
1a4a0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
1a4b0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
1a4c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
1a4d0 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
1a4e0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
1a4f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1a500 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 28  er->nRef==0 && (
1a510 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
1a520 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
1a530 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20  ->journalOff>0) 
1a540 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e  ){.      pagerUn
1a550 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
1a560 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1a570 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1a580 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1a590 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c  Create a journal
1a5a0 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72   file for pPager
1a5b0 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  .  There should 
1a5c0 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
1a5d0 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c  ERVED.** or EXCL
1a5e0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1a5f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a600 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1a610 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
1a620 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1a630 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
1a640 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  g.  Return an er
1a650 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c  ror code and rel
1a660 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74  ease the.** writ
1a670 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69  e lock if anythi
1a680 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
1a690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a6a0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1a6b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a6c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1a6d0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
1a6e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a6f0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
1a700 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
1a710 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1a720 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61  alOpen==0 );.  a
1a730 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
1a740 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
1a750 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1a760 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
1a770 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
1a780 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1a790 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1a7a0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
1a7b0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
1a7c0 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
1a7d0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
1a7e0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
1a7f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1a800 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
1a810 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1a820 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nal;.  }.  rc = 
1a830 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
1a840 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a  lusive(pPager->z
1a850 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
1a860 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20  ->jfd,.         
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a890 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 61 73 73  tempFile);.  ass
1a8a0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
1a8b0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
1a8c0 64 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  d );.  pPager->j
1a8d0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1a8e0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
1a8f0 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
1a900 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
1a910 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1a930 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
1a940 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
1a950 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
1a960 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
1a970 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69    }.    goto fai
1a980 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1a990 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nal;.  }.  sqlit
1a9a0 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
1a9b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1a9c0 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
1a9d0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  ;.  sqlite3OsSet
1a9e0 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
1a9f0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  >fd, pPager->ful
1aa00 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69  l_fsync);.  sqli
1aa10 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  te3OsOpenDirecto
1aa20 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ry(pPager->jfd, 
1aa30 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
1aa40 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ry);.  pPager->j
1aa50 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
1aa60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1aa70 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
1aa80 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1aa90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1aaa0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1aab0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
1aac0 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
1aad0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1aae0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
1aaf0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67  ->errCode;.    g
1ab00 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1ab10 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1ab20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
1ab30 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1ab40 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
1ab50 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1ab60 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
1ab70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
1ab80 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
1ab90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1aba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
1abb0 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  tBegin(pPager);.
1abc0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1abd0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1abe0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
1abf0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1ac00 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1ac10 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1ac20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ac30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ac40 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
1ac50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  }.  return rc;..
1ac60 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1ac70 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65  ournal:.  sqlite
1ac80 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
1ac90 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
1aca0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1acb0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
1acc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
1acd0 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  e a write-lock o
1ace0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1acf0 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d   The lock is rem
1ad00 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65  oved when.** the
1ad10 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
1ad20 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a  owing happen:.**
1ad30 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1ad40 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1ad50 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  Two() is called.
1ad60 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1ad70 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
1ad80 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
1ad90 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  *  sqlite3PagerC
1ada0 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
1adb0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1adc0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73  3PagerUnref() is
1add0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76   called to on ev
1ade0 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ery outstanding 
1adf0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
1ae00 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
1ae10 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1ae20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1ae30 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66  any open page of
1ae40 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1ae50 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20   file.  Nothing 
1ae60 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68  changes about th
1ae70 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75  e page - it is u
1ae80 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a  sed merely to.**
1ae90 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74   acquire a point
1aea0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20  er to the Pager 
1aeb0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73  structure and as
1aec0 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72   proof that ther
1aed0 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20  e is.** already 
1aee0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
1aef0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
1af00 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61  ** The second pa
1af10 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
1af20 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  s how much space
1af30 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73   in bytes to res
1af40 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61  erve for a.** ma
1af50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1af60 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74  e-name at the st
1af70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
1af80 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72  al when it is cr
1af90 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  eated..**.** A j
1afa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
1afb0 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73  pened if this is
1afc0 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
1afd0 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70   file.  For temp
1afe0 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20  orary.** files, 
1aff0 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74  the opening of t
1b000 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b010 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
1b020 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a  l there is an.**
1b030 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
1b040 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
1b050 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rnal..**.** If t
1b060 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
1b070 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20  lready reserved 
1b080 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69  for writing, thi
1b090 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1b0a0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  o-op..**.** If e
1b0b0 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67  xFlag is true, g
1b0c0 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20  o ahead and get 
1b0d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1b0e0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  k on the file.**
1b0f0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73   immediately ins
1b100 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20  tead of waiting 
1b110 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20  until we try to 
1b120 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e  flush the cache.
1b130 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20    The.** exFlag 
1b140 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20  is ignored if a 
1b150 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1b160 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a  lready active..*
1b170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1b180 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a  erBegin(DbPage *
1b190 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29  pPg, int exFlag)
1b1a0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1b1b0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1b1c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1b1d0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
1b1e0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
1b1f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b200 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1b210 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
1b220 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1b230 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
1b240 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b250 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1b260 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
1b270 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1b280 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1b290 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
1b2a0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1b2b0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1b2c0 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
1b2d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1b2e0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1b2f0 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
1b300 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
1b310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b320 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b330 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
1b340 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20  ESERVED;.       
1b350 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20   if( exFlag ){. 
1b360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
1b370 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1b380 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1b390 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
1b3a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b3b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b3c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1b3d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b3e0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1b3f0 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
1b400 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1b410 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  2("TRANSACTION %
1b420 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1b430 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66  ager));.      if
1b440 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
1b450 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d  rnal && !pPager-
1b460 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
1b470 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1b480 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
1b490 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
1b4a0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1b4b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b4c0 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  pen && pPager->j
1b4d0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
1b4e0 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
1b4f0 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  ens when the pag
1b500 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73  er was in exclus
1b510 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
1b520 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
1b530 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
1b540 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
1b550 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
1b560 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
1b570 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
1b580 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
1b590 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
1b5a0 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
1b5b0 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
1b5c0 65 6e 20 61 6e 64 20 74 72 75 6e 63 61 74 65 64  en and truncated
1b5d0 20 74 6f 20 30 20 62 79 74 65 73 2e 0a 20 20 20   to 0 bytes..   
1b5e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1b5f0 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
1b600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b610 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b620 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
1b630 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
1b640 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
1b650 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1b660 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1b670 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
1b680 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d  ournal = sqliteM
1b690 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
1b6a0 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
1b6b0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1b6c0 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  aInJournal ){.  
1b6d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b6e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
1b6f0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1b700 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
1b710 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1b720 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
1b730 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1b740 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1b750 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f  ert( !pPager->jo
1b760 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61  urnalOpen || pPa
1b770 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
1b780 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
1b790 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  OK );.  return r
1b7a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1b7b0 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20   a page dirty.  
1b7c0 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c  Set its dirty fl
1b7d0 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ag and add it to
1b7e0 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61   the dirty.** pa
1b7f0 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
1b800 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74  ic void makeDirt
1b810 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  y(PgHdr *pPg){. 
1b820 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
1b830 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
1b840 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1b850 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1b860 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1b870 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
1b880 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ger->pDirty;.   
1b890 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69   if( pPager->pDi
1b8a0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rty ){.      pPa
1b8b0 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  ger->pDirty->pPr
1b8c0 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  evDirty = pPg;. 
1b8d0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
1b8e0 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  revDirty = 0;.  
1b8f0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1b900 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pPg;.  }.}../
1b910 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1b920 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69   clean.  Clear i
1b930 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64  ts dirty bit and
1b940 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
1b950 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
1b960 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1b970 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
1b980 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1b990 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
1b9a0 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  {.    pPg->dirty
1b9b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1b9c0 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  g->pDirty ){.   
1b9d0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e     pPg->pDirty->
1b9e0 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
1b9f0 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20  ->pPrevDirty;.  
1ba00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
1ba10 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20  >pPrevDirty ){. 
1ba20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
1ba30 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
1ba40 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
1ba50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
1ba60 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
1ba70 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
1ba80 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
1ba90 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
1baa0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
1bab0 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
1bac0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1bad0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
1bae0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1baf0 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
1bb00 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
1bb10 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
1bb20 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
1bb30 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
1bb40 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
1bb50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1bb60 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
1bb70 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
1bb80 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
1bb90 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
1bba0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
1bbb0 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
1bbc0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
1bbd0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
1bbe0 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
1bbf0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1bc00 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
1bc10 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
1bc20 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
1bc30 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
1bc40 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
1bc50 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
1bc60 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
1bc70 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
1bc80 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1bc90 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
1bca0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1bcb0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
1bcc0 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
1bcd0 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
1bce0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
1bcf0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1bd00 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
1bd10 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
1bd20 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
1bd30 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
1bd40 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
1bd50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1bd60 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
1bd70 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
1bd80 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1bd90 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67  () or sqlite3Pag
1bda0 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  erRollback() to.
1bdb0 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61  ** reset..*/.sta
1bdc0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
1bdd0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
1bde0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
1bdf0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1be00 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg);.  Pager *pP
1be10 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1be20 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1be30 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1be40 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
1be50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1be60 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
1be70 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1be80 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1be90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
1bea0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
1beb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
1bec0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1bed0 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1bee0 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
1bef0 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
1bf00 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61   If this page wa
1bf10 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  s previously acq
1bf20 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
1bf30 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65  tent==1, that me
1bf40 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e  ans.  ** we didn
1bf50 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69  't really read i
1bf60 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
1bf70 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
1bf80 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a   can happen.  **
1bf90 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77   (for example) w
1bfa0 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
1bfb0 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
1bfc0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75  he freelist.  Bu
1bfd0 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72  t.  ** now we ar
1bfe0 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69  e (perhaps) movi
1bff0 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20  ng the page off 
1c000 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1c010 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61  for.  ** reuse a
1c020 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  nd we need to kn
1c030 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  ow its original 
1c040 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20  content so that 
1c050 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e  content.  ** can
1c060 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
1c070 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1c080 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72  al.  So do the r
1c090 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  ead at this.  **
1c0a0 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   time..  */.  rc
1c0b0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
1c0c0 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28  tent(pPg);.  if(
1c0d0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1c0e0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
1c0f0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1c100 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
1c110 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
1c120 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
1c130 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
1c140 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
1c150 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
1c160 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74  .  */.  makeDirt
1c170 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  y(pPg);.  if( pP
1c180 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1c190 28 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  (pageInStatement
1c1a0 28 70 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d  (pPg) || pPager-
1c1b0 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
1c1c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
1c1d0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1c1e0 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
1c1f0 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
1c200 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
1c210 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
1c220 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
1c230 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
1c240 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1c250 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
1c260 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
1c270 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
1c280 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
1c290 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
1c2a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c2b0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
1c2c0 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
1c2d0 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
1c2e0 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
1c2f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1c300 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
1c310 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
1c320 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1c330 28 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  (pPg, 0);.    if
1c340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c350 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c360 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
1c370 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c380 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1c390 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21  VED );.    if( !
1c3a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c3b0 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
1c3c0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
1c3d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1c3e0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1c3f0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1c400 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1c410 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c420 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c430 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1c440 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
1c450 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
1c460 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1c470 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
1c480 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1c490 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
1c4a0 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
1c4b0 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
1c4c0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1c4d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
1c4e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1c4f0 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
1c500 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
1c510 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
1c520 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
1c530 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
1c540 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
1c550 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
1c560 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
1c570 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d  >useJournal || M
1c580 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
1c590 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
1c5a0 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
1c5b0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
1c5c0 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
1c5d0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1c5e0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69  {.          PgHi
1c5f0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1c600 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1c610 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1c620 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1c630 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
1c640 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1c650 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1c660 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1c670 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
1c680 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Orig==0 );.     
1c690 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
1c6a0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
1c6b0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
1c6c0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
1c6d0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1c6e0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
1c6f0 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
1c700 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
1c710 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
1c720 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c730 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c750 20 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73      u32 cksum, s
1c760 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  aved;.          
1c770 63 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70  char *pData2, *p
1c780 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  End;.          /
1c790 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
1c7a0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
1c7b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
1c7c0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
1c7d0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
1c7e0 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
1c7f0 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
1c800 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
1c810 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
1c820 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
1c830 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
1c840 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
1c850 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1c860 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
1c870 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
1c880 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c890 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1c8a0 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
1c8b0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
1c8c0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
1c8d0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  a2);.          p
1c8e0 45 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70  End = pData2 + p
1c8f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1c900 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
1c910 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  2 -= 4;.        
1c920 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
1c930 29 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  )pEnd;.         
1c940 20 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c   put32bits(pEnd,
1c950 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
1c960 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
1c970 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
1c980 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1c990 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
1c9a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
1c9b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1c9c0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1c9d0 20 70 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a   pData2, szPg);.
1c9e0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
1c9f0 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
1ca00 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
1ca10 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  r, pPg->pgno,.  
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ca40 4f 66 66 2c 20 73 7a 50 67 29 29 3b 0a 20 20 20  Off, szPg));.   
1ca50 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
1ca60 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1ca70 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
1ca80 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1ca90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73  >journalOff += s
1caa0 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 50  zPg;.          P
1cab0 41 47 45 52 54 52 41 43 45 34 28 22 4a 4f 55 52  AGERTRACE4("JOUR
1cac0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
1cad0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1cb00 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
1cb10 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1cb20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45         *(u32*)pE
1cb30 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20  nd = saved;...  
1cb40 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
1cb50 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
1cb60 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1cb70 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
1cb80 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1cb90 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
1cba0 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
1cbb0 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
1cbc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1cbd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cbe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1cbf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cc00 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1cc10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1cc20 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
1cc30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1cc40 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1cc50 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1cc60 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
1cc70 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1cc80 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1cc90 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
1cca0 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
1ccb0 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1ccc0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1ccd0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1cce0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1ccf0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1cd00 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1cd10 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1cd20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1cd30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1cd40 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1cd50 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
1cd60 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
1cd70 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1cd80 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
1cd90 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
1cda0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1cdb0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
1cdc0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1cdd0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1cde0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1cdf0 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
1ce00 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
1ce10 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1ce20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1ce30 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1ce40 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1ce50 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
1ce60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
1ce70 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1ce80 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
1ce90 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1cea0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
1ceb0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1cec0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
1ced0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
1cee0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
1cef0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1cf00 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
1cf10 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1cf20 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
1cf30 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
1cf40 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
1cf50 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
1cf60 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
1cf70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1cf80 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1cf90 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e  .     && !pageIn
1cfa0 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
1cfb0 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67       && (int)pPg
1cfc0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1cfd0 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b  stmtSize .    ){
1cfe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1cff0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1d000 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1d010 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d020 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1d030 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1d040 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1d050 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1d060 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1d070 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d080 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
1d090 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1d0a0 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
1d0b0 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
1d0c0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1d0d0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1d0e0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1d0f0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
1d100 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
1d110 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1d120 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1d130 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d140 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1d150 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1d160 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1d170 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1d180 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1d190 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1d1a0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
1d1b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d1c0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
1d1d0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1d1e0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1d1f0 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20  , 7)-4;.        
1d200 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1d210 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1d220 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d230 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1d240 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20  ->stfd, pData2, 
1d250 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d260 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  +4);.        PAG
1d270 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a  ERTRACE3("STMT-J
1d280 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1d290 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1d2a0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1d2b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d2c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d2d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d2e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1d2f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1d300 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
1d310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d320 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
1d330 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1d340 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1d350 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1d360 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1d370 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d380 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1d390 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1d3a0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
1d3b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1d3c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1d3d0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1d3e0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
1d3f0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1d400 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1d410 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1d420 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1d430 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1d440 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1d450 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1d460 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1d470 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1d480 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d490 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d4a0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1d4b0 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
1d4c0 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
1d4d0 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
1d4e0 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
1d4f0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1d500 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1d510 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
1d520 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
1d530 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
1d540 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
1d550 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1d560 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
1d570 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
1d580 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
1d590 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1d5a0 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
1d5b0 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
1d5c0 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
1d5d0 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
1d5e0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
1d5f0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
1d600 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
1d610 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
1d620 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1d630 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1d640 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
1d650 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
1d660 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d670 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1d680 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
1d690 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
1d6a0 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1d6b0 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1d6c0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1d6d0 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
1d6e0 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
1d6f0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
1d700 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1d710 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  ..  if( !MEMDB &
1d720 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  & nPagePerSector
1d730 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
1d740 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
1d750 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1d760 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1d770 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1d780 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d7a0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
1d7b0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1d7c0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
1d7d0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d7f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1d800 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
1d810 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
1d820 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
1d830 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
1d840 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
1d850 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1d860 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
1d870 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
1d880 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
1d890 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
1d8a0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
1d8b0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1d8c0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1d8d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d8e0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
1d8f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1d900 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
1d910 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
1d920 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
1d930 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
1d940 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
1d950 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
1d960 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
1d970 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
1d980 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
1d990 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
1d9a0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1d9b0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1d9c0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1d9d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
1d9e0 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
1d9f0 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
1da00 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
1da10 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
1da20 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1da30 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1da40 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1da50 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1da60 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
1da70 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
1da80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1da90 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
1daa0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
1dab0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1dac0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
1dad0 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
1dae0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1daf0 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1db00 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
1db10 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
1db20 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
1db30 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
1db40 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
1db50 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
1db60 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1db70 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1db80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
1db90 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
1dba0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1dbb0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  r->aInJournal ||
1dbc0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
1dbd0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e  | .          pg>
1dbe0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1dbf0 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e  ze || !(pPager->
1dc00 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d  aInJournal[pg/8]
1dc10 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20  &(1<<(pg&7))).  
1dc20 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20      ) {.        
1dc30 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1dc40 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1dc50 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
1dc60 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1dc70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1dc80 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1dc90 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
1dca0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1dcb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dcc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1dcd0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1dce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1dcf0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1dd00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1dd10 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1dd20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1dd30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dd40 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
1dd50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1dd60 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
1dd70 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1dd80 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
1dd90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1dda0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1ddb0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1ddc0 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
1ddd0 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
1dde0 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
1ddf0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1de00 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
1de10 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1de20 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1de30 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1de40 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1de50 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1de60 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1de70 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1de80 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
1de90 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
1dea0 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
1deb0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1dec0 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
1ded0 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
1dee0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1def0 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
1df00 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1df10 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
1df20 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
1df30 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  t sqlite3PagerOv
1df40 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
1df50 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1df60 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
1df70 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1df80 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1df90 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1dfa0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
1dfb0 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Pg);.  if( rc==S
1dfc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dfd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1dfe0 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1dff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
1e010 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47  py(sqlite3PagerG
1e020 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61  etData(pPg), pDa
1e030 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1e040 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
1e050 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e060 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  ef(pPg);.  }.  r
1e070 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1e080 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
1e090 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1e0a0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1e0b0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1e0c0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
1e0d0 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
1e0e0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
1e0f0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
1e100 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
1e110 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
1e120 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
1e130 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
1e140 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
1e150 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
1e160 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1e170 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
1e180 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
1e190 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
1e1a0 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
1e1b0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
1e1c0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
1e1d0 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
1e1e0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1e1f0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
1e200 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
1e210 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
1e220 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
1e230 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1e240 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
1e250 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
1e260 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
1e270 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
1e280 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
1e290 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
1e2a0 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
1e2b0 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
1e2c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1e2d0 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
1e2e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
1e2f0 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
1e300 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1e310 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
1e320 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
1e330 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
1e340 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
1e350 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
1e360 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1e370 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
1e380 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
1e390 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
1e3a0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
1e3b0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
1e3c0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
1e3d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
1e3e0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1e3f0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1e400 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
1e410 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
1e420 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
1e430 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
1e440 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
1e450 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
1e460 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
1e470 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
1e480 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1e490 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
1e4a0 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  * the sqlite3Pag
1e4b0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1e4c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1e4d0 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
1e4e0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1e4f0 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64  tains critical d
1e500 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
1e510 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
1e520 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20   gets.** rolled 
1e530 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
1e540 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1e550 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1e560 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
1e570 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1e580 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1e590 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
1e5a0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
1e5b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e5c0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
1e5d0 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1e5e0 72 6e 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  rn;.  pPg->alway
1e5f0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1e600 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1e610 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1e620 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1e630 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1e640 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1e650 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1e660 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1e670 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1e680 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1e690 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1e6a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1e6b0 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1e6c0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1e6d0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1e6e0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1e6f0 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1e700 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1e710 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1e720 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1e730 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1e740 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1e750 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1e760 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1e770 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1e780 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1e790 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1e7a0 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1e7b0 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1e7c0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1e7d0 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1e7e0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1e7f0 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1e800 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1e810 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1e820 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1e830 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1e840 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1e850 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1e860 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1e870 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1e880 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1e890 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1e8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1e8b0 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
1e8c0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1e8d0 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1e8e0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1e8f0 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
1e900 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
1e910 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1e920 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d  ->pgno)).      m
1e930 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23  akeClean(pPg);.#
1e940 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1e950 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
1e960 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1e970 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1e980 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
1e990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
1e9a0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1e9b0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1e9c0 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
1e9d0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
1e9e0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
1e9f0 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
1ea00 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
1ea10 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
1ea20 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
1ea30 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
1ea40 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
1ea50 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
1ea60 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
1ea70 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1ea80 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20  *.** If we have 
1ea90 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79  not yet actually
1eaa0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
1eab0 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28  t of this page (
1eac0 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e  if.** the PgHdr.
1ead0 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73  needRead flag is
1eae0 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20   set) then this 
1eaf0 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
1eb00 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61  a promise.** tha
1eb10 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  t we will never 
1eb20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  need to read the
1eb30 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e   page content in
1eb40 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20   the future..** 
1eb50 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20  so the needRead 
1eb60 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61  flag can be clea
1eb70 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  red at this poin
1eb80 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1eb90 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1eba0 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
1ebb0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1ebc0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1ebd0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1ebe0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1ebf0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
1ec00 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1ec10 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
1ec20 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
1ec30 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1ec40 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1ec50 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
1ec60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1ec70 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1ec80 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1ec90 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1eca0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1ecb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ecc0 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1ecd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1ece0 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1ecf0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1ed00 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
1ed10 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1ed20 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52  ;.    pPg->needR
1ed30 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ead = 0;.    if(
1ed40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1ed50 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
1ed60 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1ed70 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1ed80 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1ed90 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41    }.    PAGERTRA
1eda0 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
1edb0 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
1edc0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
1edd0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1ede0 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
1edf0 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22  GARBAGE %p %d\n"
1ee00 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1ee10 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20  gno)).  }.  if( 
1ee20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1ee30 65 20 0a 20 20 20 26 26 20 21 70 61 67 65 49 6e  e .   && !pageIn
1ee40 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
1ee50 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e     && (int)pPg->
1ee60 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1ee70 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  mtSize .  ){.   
1ee80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1ee90 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1eea0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1eeb0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1eec0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1eed0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1eee0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1eef0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1ef00 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1ef10 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  gno&7);.  }.}...
1ef20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ef30 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1ef40 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1ef50 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1ef60 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1ef70 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1ef80 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1ef90 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1efa0 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1efb0 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1efc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1efd0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1efe0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1eff0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1f000 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
1f010 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
1f020 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1f030 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1f040 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1f050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f060 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1f070 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1f080 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f090 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f0a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f0b0 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
1f0c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f0d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f0e0 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  n rc;.  .    /* 
1f0f0 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74  Read the current
1f100 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32   value at byte 2
1f110 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
1f120 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1f130 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1f140 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  , 24);.  .    /*
1f150 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1f160 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1f170 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1f180 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1f190 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1f1a0 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1f1b0 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44  its(((char*)PGHD
1f1c0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72  R_TO_DATA(pPgHdr
1f1d0 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  ))+24, change_co
1f1e0 75 6e 74 65 72 29 3b 0a 20 20 0a 20 20 20 20 2f  unter);.  .    /
1f1f0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
1f200 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
1f210 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1f220 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
1f230 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
1f240 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
1f250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f260 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f270 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1f280 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1f290 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1f2a0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1f2b0 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1f2c0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1f2d0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1f2e0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1f2f0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1f300 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1f310 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1f320 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1f330 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1f340 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1f350 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1f360 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1f370 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1f380 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1f390 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1f3a0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1f3b0 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1f3c0 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1f3d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1f3e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f3f0 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1f400 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1f410 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1f420 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1f430 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1f440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f450 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
1f460 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
1f470 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
1f480 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
1f490 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
1f4a0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
1f4b0 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
1f4c0 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
1f4d0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
1f4e0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1f4f0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1f500 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1f510 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
1f520 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
1f530 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
1f540 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
1f550 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
1f560 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1f570 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
1f580 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1f590 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50  CommitPhaseOne(P
1f5a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
1f5b0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1f5c0 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
1f5d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f5e0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54  TE_OK;..  PAGERT
1f5f0 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20  RACE4("DATABASE 
1f600 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
1f610 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d  aster=%s nTrunc=
1f620 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
1f630 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f640 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
1f650 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1f660 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1f670 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
1f680 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1f690 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
1f6a0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
1f6b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1f6c0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
1f6d0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1f6e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1f6f0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
1f700 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
1f710 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
1f720 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1f730 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1f740 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1f750 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  ;..    /* If a m
1f760 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f770 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
1f780 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1f790 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   to the.    ** j
1f7a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
1f7b0 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71  n no sync is req
1f7c0 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70  uired. This happ
1f7d0 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20  ens when it is. 
1f7e0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74     ** written, t
1f7f0 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
1f800 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65  fails to upgrade
1f810 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
1f820 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   to an.    ** EX
1f830 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
1f840 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
1f850 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f  process tries to
1f860 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
1f870 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
1f880 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c  he m-j name will
1f890 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1f8a0 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  en written..    
1f8b0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1f8c0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b  er->setMaster ){
1f8d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1f8e0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1f8f0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1f900 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f910 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1f920 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20  c_exit;.#ifndef 
1f930 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1f940 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
1f950 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1f960 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1f970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1f980 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
1f990 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
1f9a0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
1f9b0 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
1f9c0 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
1f9d0 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
1f9e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1f9f0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
1fa00 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  * file..        
1fa10 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
1fa20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  i;.        int i
1fa30 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
1fa40 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
1fa50 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72        for( i=nTr
1fa60 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  unc+1; i<=pPager
1fa70 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b  ->origDbSize; i+
1fa80 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
1fa90 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  f( !(pPager->aIn
1faa0 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28  Journal[i/8] & (
1fab0 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21  1<<(i&7))) && i!
1fac0 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
1fad0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fae0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1faf0 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, i, &pPg);.   
1fb00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1fb10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fb20 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fb30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1fb40 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fb50 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1fb60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1fb70 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1fb80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fb90 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1fba0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1fbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
1fbc0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1fbd0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1fbe0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1fbf0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1fc00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fc10 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1fc20 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1fc30 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
1fc40 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1fc50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fc60 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fc70 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  it;.    }..#ifnd
1fc80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1fc90 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1fca0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1fcb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fcc0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
1fcd0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1fce0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fcf0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1fd00 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1fd10 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
1fd20 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
1fd30 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
1fd40 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1fd50 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1fd60 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1fd70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1fd80 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1fd90 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1fda0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fdb0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fdc0 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67 65 72  exit;.    pPager
1fdd0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
1fde0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
1fdf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1fe00 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1fe10 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
1fe20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1fe30 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
1fe40 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49   0);.    }.    I
1fe50 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
1fe60 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1fe70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
1fe80 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
1fe90 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
1fea0 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
1feb0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
1fec0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1fed0 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
1fee0 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
1fef0 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1ff00 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  .}.../*.** Commi
1ff10 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f  t all changes to
1ff20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
1ff30 64 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  d release the wr
1ff40 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ite lock..**.** 
1ff50 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61  If the commit fa
1ff60 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
1ff70 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61  on, a rollback a
1ff80 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a  ttempt is made.*
1ff90 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1ffa0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1ffb0 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
1ffc0 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f  worked, SQLITE_O
1ffd0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1ffe0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fff0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
20000 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
20010 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
20020 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
20030 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20040 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
20050 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
20060 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
20070 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
20080 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
20090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
200a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52  ROR;.  }.  PAGER
200b0 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
200c0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
200d0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
200e0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  MDB ){.    pPg =
200f0 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
20100 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
20110 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
20120 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69  Pg ){.      PgHi
20130 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
20140 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
20150 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
20160 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
20170 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ist);.      pPg-
20180 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
20190 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
201a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
201b0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
201c0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
201d0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  nc = 0;.      pH
201e0 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
201f0 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
20200 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
20210 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
20220 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
20230 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69  ->pDirty = 0;.#i
20240 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
20250 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
20260 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
20270 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
20280 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
20290 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
202a0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
202b0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
202c0 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
202d0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
202e0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
202f0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
20300 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
20310 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
20320 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
20330 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
20340 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
20350 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
20360 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20370 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
20380 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
20390 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
203a0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
203b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
203c0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
203d0 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65  SYNCED || !pPage
203e0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
203f0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
20400 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
20410 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
20420 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
20430 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  er, rc);.}../*.*
20440 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
20450 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
20460 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
20470 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
20480 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
20490 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
204a0 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
204b0 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
204c0 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
204d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
204e0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
204f0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
20500 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
20510 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
20520 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
20530 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
20540 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
20550 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20   or unless some 
20560 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
20570 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73   is writing tras
20580 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  h into the journ
20590 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f  al file (SQLITE_
205a0 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75  CORRUPT) or.** u
205b0 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61  nless a prior ma
205c0 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53  lloc() failed (S
205d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41  QLITE_NOMEM).  A
205e0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
205f0 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65  .** codes are re
20600 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74  turned for all t
20610 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20  hese occasions. 
20620 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53   Otherwise,.** S
20630 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
20640 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
20650 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
20660 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
20670 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41  {.  int rc;.  PA
20680 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  GERTRACE2("ROLLB
20690 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
206a0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
206b0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
206c0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
206d0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
206e0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
206f0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
20700 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
20710 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
20720 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
20730 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
20740 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
20750 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
20760 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
20770 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
20780 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
20790 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
207a0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
207b0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
207c0 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
207d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
207e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
207f0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
20800 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
20810 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
20820 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
20830 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
20840 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
20850 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
20860 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
20870 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
20880 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20  ("ROLLBACK-PAGE 
20890 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e  %d of %d\n", p->
208a0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
208b0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65  ager));.      }e
208c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47  lse{.        PAG
208d0 45 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25  ERTRACE3("PAGE %
208e0 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64  d is clean on %d
208f0 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
20900 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
20920 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
20930 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74  );.      p->dirt
20940 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
20950 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
20960 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
20970 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  mt = 0;.      pH
20980 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
20990 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
209a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
209b0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
209c0 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
209d0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
209e0 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  p, pPager->pageS
209f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
20a00 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
20a10 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
20a20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
20a30 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
20a40 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
20a50 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
20a60 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
20a70 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
20a80 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
20a90 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
20aa0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
20ab0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
20ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20ad0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
20ae0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
20af0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
20b00 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
20b10 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
20b20 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
20b30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
20b40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
20b50 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
20b60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
20b70 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
20b80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
20b90 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
20ba0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
20bb0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
20bc0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
20bd0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
20be0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
20bf0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20c00 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
20c10 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
20c20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
20c30 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
20c40 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
20c50 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
20c60 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
20c70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
20c80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20c90 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
20ca0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
20cb0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20cc0 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
20cd0 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73  }.  /* pager_res
20ce0 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  et(pPager); */. 
20cf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
20d00 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  = -1;..  /* If a
20d10 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
20d20 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
20d30 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
20d40 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
20d50 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  er.  ** cache. S
20d60 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
20d70 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
20d80 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
20d90 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73  error .  ** pers
20da0 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72  istent..  */.  r
20db0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
20dc0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
20dd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
20de0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
20df0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
20e00 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
20e10 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
20e20 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20e30 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
20e40 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  itable..*/.int s
20e50 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
20e60 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61  donly(Pager *pPa
20e70 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
20e80 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b  Pager->readOnly;
20e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
20ea0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
20eb0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
20ec0 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
20ed0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
20ee0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
20ef0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
20f00 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69  ger->nRef;.}..#i
20f10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
20f20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20f30 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
20f40 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
20f50 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
20f60 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
20f70 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
20f80 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
20f90 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
20fa0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
20fb0 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
20fc0 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
20fd0 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
20fe0 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
20ff0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
21000 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
21010 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
21020 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
21030 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
21040 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
21050 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
21060 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
21070 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
21080 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
21090 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
210a0 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
210b0 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
210c0 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
210d0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
210e0 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
210f0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
21100 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
21110 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
21120 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21130 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
21140 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
21150 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
21160 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
21170 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
21180 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
21190 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
211a0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
211b0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
211c0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
211d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
211e0 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
211f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
21200 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
21210 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
21220 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21230 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
21240 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
21250 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
21260 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  ze>=0 );.  PAGER
21270 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
21280 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
21290 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
212a0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
212b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
212c0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
212d0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
212e0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
212f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21300 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
21310 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
21320 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
21330 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
21340 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
21350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
21360 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
21370 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
21380 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
21390 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
213a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
213b0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
213c0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
213d0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
213e0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
213f0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
21400 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
21410 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21420 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
21430 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
21440 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
21450 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
21460 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
21470 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
21480 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
21490 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
214a0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70  ->stmtJSize == p
214b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
214c0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  f );.#endif.  pP
214d0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
214e0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
214f0 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
21500 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
21510 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
21520 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
21530 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
21540 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
21550 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
21560 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
21570 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
21580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
21590 65 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e  entemp(&pPager->
215a0 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
215b0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
215c0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
215d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
215e0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
215f0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
21600 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
21610 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
21620 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21630 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
21640 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
21650 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
21660 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
21670 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
21680 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
21690 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
216a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
216b0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
216c0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
216d0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
216e0 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
216f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
21700 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
21710 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
21720 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45  *pNext;.    PAGE
21730 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f  RTRACE2("STMT-CO
21740 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
21750 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
21760 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
21770 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
21780 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
21790 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  , 0);.      /* s
217a0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
217b0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
217c0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
217d0 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
217e0 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
217f0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
21800 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
21810 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
21820 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
21830 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
21840 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
21850 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
21860 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
21870 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ger);.        pN
21880 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  ext = pHist->pNe
21890 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  xtStmt;.        
218a0 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69  assert( pHist->i
218b0 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  nStmt );.       
218c0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
218d0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   0;.        pHis
218e0 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
218f0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
21900 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
21910 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
21920 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Stmt);.        p
21930 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
21940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21950 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
21960 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Rec = 0;.    pPa
21970 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
21980 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
21990 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  pStmt = 0;.  }. 
219a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
219b0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
219c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
219d0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
219e0 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
219f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21a00 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61  rStmtRollback(Pa
21a10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21a20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
21a30 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
21a40 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
21a50 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
21a60 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
21a70 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
21a80 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
21a90 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
21aa0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
21ab0 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  Hist;.      for(
21ac0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
21ad0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73  t; pPg; pPg=pHis
21ae0 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  t->pNextStmt){. 
21af0 20 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50         pHist = P
21b00 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
21b10 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
21b20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
21b30 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
21b40 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
21b50 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73  _DATA(pPg), pHis
21b60 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  t->pStmt, pPager
21b70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
21b90 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
21ba0 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
21bb0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
21bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
21bd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
21be0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
21bf0 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61  mtSize;.      pa
21c00 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
21c10 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
21c20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21c30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21c40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
21c50 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
21c60 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
21c70 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
21c80 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
21c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
21ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21cb0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
21cc0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
21cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21ce0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
21cf0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
21d00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21d10 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
21d20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
21d30 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
21d40 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21d50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
21d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21d70 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
21d80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21d90 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
21da0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
21db0 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  Dirname(Pager *p
21dc0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21dd0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
21de0 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
21df0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
21e00 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
21e10 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
21e20 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21e30 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
21e40 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
21e50 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
21e60 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
21e70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
21e80 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
21e90 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
21ea0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
21eb0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
21ec0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
21ed0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
21ee0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
21ef0 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
21f00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21f10 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21f20 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65  noSync;.}..#ifde
21f30 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
21f40 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  EC./*.** Set the
21f50 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
21f60 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
21f70 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
21f80 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
21f90 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
21fa0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
21fb0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
21fc0 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
21fd0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
21fe0 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
21ff0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
22000 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
22010 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
22020 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
22030 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
22040 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  ve the page iden
22050 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20  tified by pData 
22060 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
22070 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a   in the file. .*
22080 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
22090 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
220a0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
220b0 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75  page pgno. If cu
220c0 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67  rrent page.** pg
220d0 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
220e0 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
220f0 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
22100 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65   not written the
22110 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73  re by.** by this
22120 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61   routine. The sa
22130 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68  me applies to th
22140 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66  e page pData ref
22150 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20  ers to on entry 
22160 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
22170 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
22180 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
22190 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70   refered to by p
221a0 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69  Data remain vali
221b0 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
221c0 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
221d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
221e0 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61  e pData (i.e. da
221f0 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
22200 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
22210 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
22220 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
22230 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
22240 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
22250 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
22260 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
22270 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
22280 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
22290 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
222a0 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
222b0 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
222c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
222d0 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
222e0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
222f0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
22300 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
22310 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
22320 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
22330 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
22340 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
22350 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
22360 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
22370 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
22380 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
22390 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
223a0 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20  *pPgOld; .  int 
223b0 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  h;.  Pgno needSy
223c0 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
223d0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
223e0 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  >0 );..  PAGERTR
223f0 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE5("MOVE %d pa
22400 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
22410 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
22420 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
22430 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22440 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
22450 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49  Sync, pgno);.  I
22460 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
22470 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
22480 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
22490 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65  no))..  pager_ge
224a0 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
224b0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
224c0 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  ync ){.    needS
224d0 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
224e0 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
224f0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
22500 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22510 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  Pg->dirty );.   
22520 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22530 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
22540 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50  ..  /* Unlink pP
22550 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
22560 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69  -chain */.  unli
22570 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
22580 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  er, pPg);..  /* 
22590 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
225a0 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
225b0 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
225c0 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
225d0 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  ** from it's has
225e0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
225f0 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
22600 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
22610 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
22620 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
22630 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
22640 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
22650 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
22660 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
22670 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
22680 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
22690 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
226a0 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
226b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
226c0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  gOld->nRef==0 );
226d0 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  .    unlinkHashC
226e0 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
226f0 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  Old);.    makeCl
22700 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20  ean(pPgOld);.   
22710 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65   if( pPgOld->nee
22720 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
22730 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69  ssert( pPgOld->i
22740 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
22750 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
22760 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 1;.      pPg-
22770 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
22780 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
22790 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
227a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
227b0 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
227c0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
227d0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
227e0 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d  to the new hash-
227f0 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  chain. */.  asse
22800 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
22810 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
22820 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  o;.  h = pgno & 
22830 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
22840 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
22850 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20  >aHash[h] ){.   
22860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22870 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
22880 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Hash==0 );.    p
22890 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
228a0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
228b0 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
228c0 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
228d0 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61  >aHash[h];.  pPa
228e0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
228f0 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  pPg;.  pPg->pPre
22900 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61  vHash = 0;..  ma
22910 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
22920 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
22930 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e  he = 1;..  if( n
22940 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20  eedSyncPgno ){. 
22950 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e     /* If needSyn
22960 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72  cPgno is non-zer
22970 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  o, then the jour
22980 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74  nal file needs t
22990 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e  o be .    ** syn
229a0 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79  c()ed before any
229b0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
229c0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
229d0 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50  e page needSyncP
229e0 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72  gno..    ** Curr
229f0 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70  ently, no such p
22a00 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  age exists in th
22a10 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64  e page-cache and
22a20 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67   the .    ** Pag
22a30 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.aInJournal bi
22a40 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  t has been set. 
22a50 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65  This needs to be
22a60 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61   remedied by loa
22a70 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ding.    ** the 
22a80 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
22a90 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65  ger-cache and se
22aa0 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
22ab0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20  needSync flag.. 
22ac0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22ad0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
22ae0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
22af0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
22b00 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
22b10 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
22b20 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
22b30 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
22b40 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
22b50 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  ;.    PgHdr *pPg
22b60 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Hdr;.    assert(
22b70 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
22b80 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
22b90 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
22ba0 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
22bb0 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20  no, &pPgHdr);.  
22bc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22bd0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
22be0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
22bf0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  dSync = 1;.    p
22c00 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20  PgHdr->needSync 
22c10 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
22c20 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
22c30 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50      makeDirty(pP
22c40 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
22c50 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
22c60 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Hdr);.  }..  ret
22c70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22c80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
22c90 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22ca0 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
22cb0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
22cc0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
22cd0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
22ce0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
22cf0 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
22d00 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
22d10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
22d20 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
22d30 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
22d40 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
22d50 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
22d60 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
22d70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
22d80 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
22d90 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
22da0 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
22db0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
22dc0 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
22dd0 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f  n (pPager?PGHDR_
22de0 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
22df0 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ager):0);.}../*.
22e00 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
22e10 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
22e20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
22e30 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
22e40 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
22e50 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22e60 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
22e70 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
22e80 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
22e90 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
22ea0 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
22eb0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
22ec0 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
22ed0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
22ee0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
22ef0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
22f00 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
22f10 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
22f20 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22f30 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
22f40 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22f50 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
22f60 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
22f70 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
22f80 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
22f90 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
22fa0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
22fb0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
22fc0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
22fd0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
22fe0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
22ff0 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
23000 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
23010 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
23020 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
23030 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
23040 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23050 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
23060 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
23070 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
23080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
23090 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
230a0 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
230b0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
230c0 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
230d0 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
230e0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
230f0 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
23100 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
23110 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  = eMode;.  }.  r
23120 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
23130 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
23140 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
23150 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
23160 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
23170 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
23180 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
23190 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c  state of the fil
231a0 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67  e lock for the g
231b0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54  iven pager..** T
231c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
231d0 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43  is one of NO_LOC
231e0 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  K, SHARED_LOCK, 
231f0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a  RESERVED_LOCK,.*
23200 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20  * PENDING_LOCK, 
23210 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
23220 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
23230 33 50 61 67 65 72 4c 6f 63 6b 73 74 61 74 65 28  3PagerLockstate(
23240 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23250 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
23260 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67  OsLockState(pPag
23270 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69  er->fd);.}.#endi
23280 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
23290 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
232a0 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  nt a listing of 
232b0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70  all referenced p
232c0 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72  ages and their r
232d0 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  ef count..*/.voi
232e0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
232f0 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
23300 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
23310 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
23320 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
23330 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
23340 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
23350 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
23360 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
23370 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
23380 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e  GE %3d addr=%p n
23390 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
233a0 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47     pPg->pgno, PG
233b0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
233c0 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
233d0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64  }.}.#endif..#end
233e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
233f0 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.