/ Hex Artifact Content
Login

Artifact 42cffb2e04a6efd23cfff28a15d686fbaa076b59:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 34  : pager.c,v 1.34
0350: 33 20 32 30 30 37 2f 30 36 2f 31 33 20 31 35 3a  3 2007/06/13 15:
0360: 32 32 3a 32 38 20 64 61 6e 69 65 6c 6b 31 39 37  22:28 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63   OsFile.** struc
0710: 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65  t as it's argume
0720: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  nt..*/.#define P
0730: 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29  AGERID(p) ((int)
0740: 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65  (p->fd)).#define
0750: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0760: 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a  ) ((int)fd)../*.
0770: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0780: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0790: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
07a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
07b0: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
07c0: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
07d0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07f0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
0800: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0810: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
0820: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
0830: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0840: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0850: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0860: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0870: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0880: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08a0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
08b0: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
08c0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
08d0: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
0910: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
0920: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0950: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0960: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0980: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0990: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
09a0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
09b0: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
09c0: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
09d0: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09e0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
0a10: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
0a20: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
0a30: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a60: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a70: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a80: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0ab0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0ac0: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0af0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0b00: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0b10: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0b20: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0b30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b40: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b50: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b60: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0ba0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0bb0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0bc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0be0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bf0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0c00: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0c30: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c40: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c50: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c60: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c70: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c80: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0ca0: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0cb0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0cc0: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cf0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0d00: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0d10: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0d30: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d40: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d50: 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20  emove or.**     
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a    truncate the j
0d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
0d90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0da0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0db0: 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62            will b
0dc0: 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  e committed..**.
0dd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0de0: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41  e comes up in PA
0df0: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0e00: 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a   first time a.**
0e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
0e20: 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73  () occurs, the s
0e30: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e40: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
0e50: 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70  ..** After all p
0e60: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ages have been r
0e70: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
0e80: 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28  lite_page_unref(
0e90: 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ),.** the state 
0ea0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b  transitions back
0eb0: 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   to PAGER_UNLOCK
0ec0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0ed0: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0ee0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
0ef0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f00: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f10: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f20: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
0f40: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0f50: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0f60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0f70: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0f80: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0f90: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0fa0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
0fb0: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
0fc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0fd0: 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  ).** PAGER_RESER
0fe0: 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74  VED means that t
0ff0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20  here is an open 
1000: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1010: 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ..** The transit
1020: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1030: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62 65  LUSIVE occurs be
1040: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1050: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1060: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1070: 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65 73  e, though writes
1080: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1090: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75  .** journal occu
10a0: 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41 47  rs with just PAG
10b0: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66  ER_RESERVED.  Af
10c0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61  ter an sqlite3Pa
10d0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  gerRollback().**
10e0: 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
10f0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1100: 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e 20  , the state can 
1110: 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  go back to PAGER
1120: 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69  _SHARED,.** or i
1130: 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50 41  t can stay at PA
1140: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66  GER_EXCLUSIVE if
1150: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
1160: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
1170: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1180: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1190: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
11a0: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
11b0: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
11c0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
11d0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
11e0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
11f0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
1200: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1210: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1220: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1230: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1240: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1250: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1260: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1270: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1280: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1290: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
12a0: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
12b0: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
12c0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
12d0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
12e0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12f0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
1300: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
1310: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1320: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1330: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1340: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1350: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1360: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1370: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1380: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1390: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
13a0: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
13b0: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
13c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
13d0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
13e0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
13f0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
1400: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
1410: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1420: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1430: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1440: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1450: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1460: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1470: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1480: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1490: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
14a0: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
14b0: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
14c0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
14d0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
14e0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
14f0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
1500: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
1510: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1520: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1530: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1560: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1570: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1580: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
15a0: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
15b0: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
15c0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
15d0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
15e0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
15f0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
1600: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
1610: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1620: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1630: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1640: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1650: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1660: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1670: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1680: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1690: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
16a0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
16b0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
16c0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
16d0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
16e0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
16f0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1700: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1710: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1720: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1730: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1740: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1750: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1760: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1770: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1780: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17a0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
17b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
17c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
17d0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
17e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
17f0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1800: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1810: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1820: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1830: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1840: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1850: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1860: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1870: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1880: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1890: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
18a0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
18b0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
18c0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
18d0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
18e0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
18f0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1900: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1910: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1920: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1930: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1940: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1950: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1960: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1970: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1980: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1990: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
19a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
19b0: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
19c0: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
19d0: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
19e0: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
19f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1a00: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
1a10: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
1a20: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
1a50: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
1a60: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a70: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a80: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a90: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1aa0: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1ab0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1ac0: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1ad0: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1ae0: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1af0: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1b00: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1b20: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1b30: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1b40: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1b50: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b60: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1b70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1b80: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
1bb0: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
1bc0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
1bd0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf0: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
1c00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
1c10: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
1c20: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
1c40: 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  able DontRollbac
1c50: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
1c60: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 52 65  e */.  u8 needRe
1c70: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
1c80: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 63 6f        /* Read co
1c90: 6e 74 65 6e 74 20 69 66 20 50 61 67 65 72 57 72  ntent if PagerWr
1ca0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1cb0: 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e  */.  short int n
1cc0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1cd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ce0: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
1cf0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1d00: 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69  pDirty, *pPrevDi
1d10: 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79  rty;    /* Dirty
1d20: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20   pages */.  u32 
1d30: 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  notUsed;        
1d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1d50: 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69  ffer space */.#i
1d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1d70: 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61  K_PAGES.  u32 pa
1d80: 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20  geHash;.#endif. 
1d90: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /* pPager->page
1da0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61  Size bytes of pa
1db0: 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  ge data follow t
1dc0: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  his header */.  
1dd0: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
1de0: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
1df0: 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  ata follow the p
1e00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  age data */.};..
1e10: 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  /*.** For an in-
1e20: 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61  memory only data
1e30: 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61  base, some extra
1e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1e50: 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a  recorded about.*
1e60: 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74  * each page so t
1e70: 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20  hat changes can 
1e80: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1e90: 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20   (Journal files 
1ea0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20  are not.** used 
1eb0: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1ec0: 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66  tabases.)  The f
1ed0: 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61  ollowing informa
1ee0: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f  tion is added to
1ef0: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65  .** the end of e
1f00: 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b  very EXTRA block
1f10: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1f20: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
1f30: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1f40: 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
1f50: 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20   added directly 
1f60: 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72  to the PgHdr str
1f70: 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74  ucture..** But t
1f80: 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b  hen it would tak
1f90: 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20  e up an extra 8 
1fa0: 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65  bytes of storage
1fb0: 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a   on every PgHdr.
1fc0: 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b  ** even for disk
1fd0: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73  -based databases
1fe0: 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20  .  Splitting it 
1ff0: 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65  out saves 8 byte
2000: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  s.  This.** is o
2010: 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66  nly a savings of
2020: 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20   0.8% but those 
2030: 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20  percentages add 
2040: 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  up..*/.typedef s
2050: 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20  truct PgHistory 
2060: 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63  PgHistory;.struc
2070: 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20  t PgHistory {.  
2080: 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f  u8 *pOrig;     /
2090: 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  * Original page 
20a0: 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74  text.  Restore t
20b0: 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c  o this on a full
20c0: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75   rollback */.  u
20d0: 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a  8 *pStmt;     /*
20e0: 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20   Text as it was 
20f0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2100: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2110: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50  statement */.  P
2120: 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c  gHdr *pNextStmt,
2130: 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a   *pPrevStmt;  /*
2140: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
2150: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
2160: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2170: 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  inStmt;         
2180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2190: 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74  RUE if in the st
21a0: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
21b0: 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  al */.};../*.** 
21c0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
21d0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
21e0: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
21f0: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
2200: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
2210: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
2220: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
2230: 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78  Codec!=0 ){ P->x
2240: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2250: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64  rg,D,N,X); }.# d
2260: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
2270: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50  ,N,X) ((char*)(P
2280: 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78  ->xCodec!=0?P->x
2290: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
22a0: 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65  rg,D,N,X):D)).#e
22b0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  lse.# define COD
22c0: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20  EC1(P,D,N,X) /* 
22d0: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
22e0: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
22f0: 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e  ) ((char*)D).#en
2300: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2310: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2320: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2330: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2340: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2350: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2360: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2370: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2380: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2390: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
23a0: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
23b0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
23c0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
23d0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
23e0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
23f0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
2400: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2410: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2420: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2430: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2440: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2450: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2460: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2470: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
2480: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
2490: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
24a0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
24b0: 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64  .** Pager.errCod
24c0: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
24d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
24e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
24f0: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  .** or SQLITE_FU
2500: 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20  LL. Once one of 
2510: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
2520: 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69  errors occurs, i
2530: 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e  t persists.** an
2540: 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  d is returned as
2550: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65   the result of e
2560: 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72  very major pager
2570: 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a   API call.  The.
2580: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72  ** SQLITE_FULL r
2590: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
25a0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
25b0: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
25c0: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
25d0: 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20  next successful 
25e0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66  rollback is perf
25f0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67  ormed on the pag
2600: 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a  er cache. Also,.
2610: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  ** SQLITE_FULL d
2620: 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74  oes not affect t
2630: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2640: 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
2650: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  PagerLookup().**
2660: 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20   APIs, they may 
2670: 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75  still be used su
2680: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73  ccessfully..*/.s
2690: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
26a0: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26c0: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
26d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
26e0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
26f0: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
2700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2710: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
2720: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2730: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
2740: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2750: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
2760: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
2770: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
2780: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
27a0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
27b0: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
27c0: 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b  /.  u8 stmtOpen;
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
27f0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
2800: 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20  nal is open */. 
2810: 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20   u8 stmtInUse;  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2830: 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61  True we are in a
2840: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
2850: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  ansaction */.  u
2860: 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20  8 stmtAutoopen; 
2870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2880: 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20  en stmt journal 
2890: 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  when main journa
28a0: 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20  l is opened*/.  
28b0: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28d0: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
28e0: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
28f0: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
2920: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
2930: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
2940: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f 66 73 79  */.  u8 full_fsy
2950: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2960: 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c 46 53   /* Use F_FULLFS
2970: 59 4e 43 20 77 68 65 6e 20 61 76 61 69 6c 61 62  YNC when availab
2980: 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  le */.  u8 state
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
29b0: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
29c0: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
29d0: 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20  .  u8 tempFile; 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f0: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61  * zFilename is a
2a00: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2a10: 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79  */.  u8 readOnly
2a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a30: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
2a40: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
2a50: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  e */.  u8 needSy
2a60: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2a80: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
2a90: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
2aa0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43  l */.  u8 dirtyC
2ab0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2ac0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
2ad0: 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20  ched pages have 
2ae0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
2af0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
2b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
2b10: 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  ble DontRollback
2b20: 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  () for all pages
2b30: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
2b60: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
2b70: 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73  O */.  u8 setMas
2b80: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
2b90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2ba0: 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65  m-j name has bee
2bb0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e  n written to jrn
2bc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  l */.  u8 doNotS
2bd0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2be0: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57     /* Boolean. W
2bf0: 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f  hile true, do no
2c00: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
2c10: 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73  e */.  u8 exclus
2c20: 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  iveMode;        
2c30: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54     /* Boolean. T
2c40: 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d  rue if locking_m
2c50: 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a  ode==EXCLUSIVE *
2c60: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
2c70: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
2c80: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
2c90: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
2ca0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
2cb0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cd0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2ce0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2d20: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
2d30: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2d40: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2d50: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
2d60: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
2d70: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
2d80: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
2d90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2da0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2db0: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2dc0: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  in() */.  int nR
2dd0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2df0: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
2e00: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2e10: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
2e20: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2e30: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
2e40: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
2e50: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
2e60: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63  /.  int stmtNRec
2e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
2e90: 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62  ords in stmt sub
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2eb0: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
2ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2ed0: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
2ee0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2ef0: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2f00: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f20: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2f30: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  page */.  int nP
2f40: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f50: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
2f60: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
2f70: 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  ry pages */.  in
2f80: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2fa0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2fb0: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2fc0: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2fd0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2ff0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
3000: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
3010: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
3020: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
3030: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3040: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
3050: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
3060: 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e  /.  u8 *aInJourn
3070: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
3080: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
3090: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
30a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30b0: 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20  .  u8 *aInStmt; 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
30e0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
30f0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
3100: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
3110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3120: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3130: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
3140: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
3150: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3160: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3170: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
3180: 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20  irectory;       
3190: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
31a0: 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61   hold database a
31b0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
31c0: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64   */.  OsFile *fd
31d0: 2c 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  , *jfd;         
31e0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
31f0: 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61  ptors for databa
3200: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a  se and journal *
3210: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64  /.  OsFile *stfd
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
3240: 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  or for the state
3250: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a  ment subjournal*
3260: 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
3270: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20  *pBusyHandler;  
3280: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
3290: 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72  lite.busyHandler
32a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
32b0: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
32c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
32d0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
32e0: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
32f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
3300: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
3310: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
3320: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
3330: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
3340: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
3350: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
3360: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
3370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3380: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
3390: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
33a0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64  ournal */.  PgHd
33b0: 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20  r *pDirty;      
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
33d0: 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  of all dirty pag
33e0: 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  es */.  i64 jour
33f0: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
3400: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
3410: 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  yte offset in th
3420: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3430: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
3440: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3450: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
3460: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
3470: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  al header */.  i
3480: 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20  64 stmtHdrOff;  
3490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
34a0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
34b0: 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20  er written this 
34c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
34d0: 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20  64 stmtCksum;   
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b             /* ck
34f0: 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61  sumInit when sta
3500: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
3510: 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  ed */.  i64 stmt
3520: 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  JSize;          
3530: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
3540: 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62  ournal at stmt_b
3550: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
3560: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
3570: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
3580: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
3590: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
35a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
35b0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
35c0: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
35d0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
35e0: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
35f0: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
3600: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
3610: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
3620: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
3630: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
3640: 78 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50  xDestructor)(DbP
3650: 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  age*,int); /* Ca
3660: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3670: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
3680: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
3690: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
36a0: 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c  *,int);   /* Cal
36b0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
36c0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
36d0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
36e0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
36f0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
3700: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
3710: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
3720: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
3730: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
3740: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
3750: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3760: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
3770: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
3780: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
37b0: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  ger hash table *
37c0: 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  /.  PgHdr **aHas
37d0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
37e0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
37f0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
3800: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66   to PgHdr */.#if
3810: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3820: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
3830: 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65  ENT.  Pager *pNe
3840: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
3850: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
3860: 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68   of pagers in th
3870: 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e  is thread */.#en
3880: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
3890: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
38a0: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
38b0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
38c0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
38d0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
38e0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
38f0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
3900: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
3910: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a  e changes */.};.
3920: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
3930: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
3940: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
3950: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
3960: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
3970: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
3980: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
3990: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
39a0: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
39b0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
39c0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
39d0: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
39e0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
39f0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
3a00: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
3a10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3a20: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
3a30: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
3a40: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3a50: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
3a60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
3a70: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
3a80: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
3a90: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3aa0: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
3ab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3ac0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3ad0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
3ae0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
3af0: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
3b00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3b10: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
3b20: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
3b30: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
3b40: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
3b50: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
3b60: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
3b70: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
3b80: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
3b90: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
3ba0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
3bb0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
3bc0: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
3bd0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
3be0: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
3c00: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
3c10: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3c20: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
3c30: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
3c40: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3c50: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
3c60: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
3c70: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
3c80: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
3c90: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
3ca0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
3cb0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
3cc0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
3cd0: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
3ce0: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
3cf0: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
3d00: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
3d10: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
3d20: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
3d30: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
3d40: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
3d50: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
3d60: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
3d70: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
3d80: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
3d90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
3da0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
3db0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
3dc0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3dd0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
3de0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
3df0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
3e00: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
3e10: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
3e20: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
3e30: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
3e40: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
3e50: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
3e60: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
3e70: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
3e80: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
3e90: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
3ea0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
3eb0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
3ec0: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
3ed0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
3ee0: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
3ef0: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
3f00: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
3f10: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
3f20: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
3f30: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
3f40: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
3f50: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
3f60: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
3f70: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
3f80: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
3f90: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
3fa0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
3fb0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
3fc0: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
3fd0: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
3fe0: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
3ff0: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
4000: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
4010: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
4020: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
4030: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
4040: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
4050: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
4060: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
4070: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
4080: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
4090: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
40a0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
40b0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
40c0: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
40d0: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
40e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
40f0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
4100: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
4110: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4120: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
4130: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
4140: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
4150: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
4160: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
4170: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
4180: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
4190: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
41a0: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
41b0: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
41c0: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
41d0: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
41e0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
41f0: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
4200: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
4210: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
4220: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
4230: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
4240: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
4250: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4260: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4270: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4280: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4290: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
42a0: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
42b0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
42c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
42d0: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
42e0: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
42f0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4300: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
4310: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
4320: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
4330: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
4340: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
4350: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
4360: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4370: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4380: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
43a0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
43b0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
43c0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
43d0: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
43e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
43f0: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
4400: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
4410: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
4420: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
4430: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
4440: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
4450: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
4460: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
4470: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
4480: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
4490: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
44a0: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
44b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
44c0: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
44d0: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
44e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
44f0: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
4500: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
4510: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
4520: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
4530: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
4540: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
4550: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
4560: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
4570: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
4580: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
4590: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
45a0: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
45b0: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
45c0: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
45d0: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
45e0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
45f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
4600: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
4610: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
4620: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
4630: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72  ../*.** Enable r
4640: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74  eference count t
4650: 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62  racking (for deb
4660: 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f  ugging) here:.*/
4670: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4680: 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72  EBUG.  int pager
4690: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
46a0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
46b0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
46c0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
46d0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
46e0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
46f0: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
4700: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
4710: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4720: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
4730: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
4740: 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61  p nRef=%-3d tota
4750: 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
4760: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4770: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
4780: 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e  ef, p->pPager->n
4790: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
47a0: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
47b0: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
47c0: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
47d0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
47e0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
47f0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
4800: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4810: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
4820: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4830: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
4840: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
4850: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
4860: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
4870: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
4880: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
4890: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
48a0: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
48b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
48c0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
48d0: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
48e0: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
48f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
4900: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
4910: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
4920: 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f     return PGHDR_
4930: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
4940: 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20  ger)->inStmt;.  
4950: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
4960: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4970: 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50  ;.    u8 *a = pP
4980: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20  ager->aInStmt;. 
4990: 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26 20     return (a && 
49a0: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
49b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28  r->stmtSize && (
49c0: 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  a[pgno/8] & (1<<
49d0: 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d  (pgno&7))));.  }
49e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
49f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
4a00: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
4a10: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
4a20: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
4a30: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
4a40: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
4a50: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
4a60: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
4a70: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
4a80: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
4a90: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
4aa0: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48  N-1))==0 );.  aH
4ab0: 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ash = sqliteMall
4ac0: 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  oc( sizeof(aHash
4ad0: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20  [0])*N );.  if( 
4ae0: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
4af0: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
4b00: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
4b10: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
4b20: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
4b30: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
4b40: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
4b50: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
4b60: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
4b70: 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67  Hash = N;.  pPag
4b80: 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73  er->aHash = aHas
4b90: 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  h;.  for(pPg=pPa
4ba0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4bb0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
4bc0: 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  l){.    int h;. 
4bd0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
4be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
4bf0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
4c00: 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
4c10: 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
4c20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4c30: 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67     }.    h = pPg
4c40: 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a  ->pgno & (N-1);.
4c50: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
4c60: 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20  sh = aHash[h];. 
4c70: 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20     if( aHash[h] 
4c80: 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68  ){.      aHash[h
4c90: 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
4ca0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48  Pg;.    }.    aH
4cb0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
4cc0: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
4cd0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
4ce0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4cf0: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4d00: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d10: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4d20: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4d30: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4d40: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4d50: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4d60: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4d70: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4d80: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4d90: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4da0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4db0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4dc0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4de0: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4df0: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4e00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4e10: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4e20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4e30: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4e40: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4e60: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
4e70: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
4e80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4e90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4ea0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4eb0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
4ec0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
4ed0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
4ee0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
4ef0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
4f00: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
4f10: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4f20: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4f30: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4f40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4f50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4f60: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4f70: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4f80: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4f90: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4fa0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4fb0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4fc0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
4fd0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
4fe0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
4ff0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
5000: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
5010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
5020: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5030: 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65  at offset 'offse
5040: 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  t' from the page
5050: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
5060: 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27 70  * page header 'p
5070: 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  '..*/.static u32
5080: 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
5090: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
50a0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
50b0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
50c0: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
50d0: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
50e0: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
50f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5100: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 7d 0a  Get4byte(ac);.}.
5110: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5120: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
5130: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65  called when an e
5140: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
5150: 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  in the pager.** 
5160: 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20  code. The first 
5170: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
5180: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
5190: 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  er structure, th
51a0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20  e.** second the 
51b0: 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
51c0: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
51d0: 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
51e0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65  unction. .** The
51f0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5200: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
5210: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5220: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
5230: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
5240: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5250: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
5260: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
5270: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
5280: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
5290: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
52a0: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
52b0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
52c0: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
52d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
52e0: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
52f0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
5300: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
5310: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
5320: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
5330: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
5340: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5350: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
5360: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67  ITE_FULL || pPag
5370: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
5380: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a  ITE_OK );.  if(.
5390: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
53a0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
53b0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
53c0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
53d0: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
53e0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
53f0: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
5400: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
5410: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
5420: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
5430: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
5440: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
5450: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
5460: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
5470: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
5480: 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68  *pPage){.  u32 h
5490: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
54a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
54b0: 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69  r *pData = (unsi
54c0: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
54d0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
54e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
54f0: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
5500: 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  geSize; i++){.  
5510: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69    hash = (hash+i
5520: 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  )^pData[i];.  }.
5530: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
5540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
5550: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
5560: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
5570: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
5580: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5590: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
55a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
55b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
55c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
55d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
55e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
55f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
5600: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
5610: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
5620: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
5630: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
5640: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
5650: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
5660: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
5670: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5680: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
5690: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
56a0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
56b0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44  >errCode || MEMD
56c0: 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20  B || pPg->dirty 
56d0: 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  || .      pPg->p
56e0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
56f0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
5700: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
5710: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
5720: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
5730: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
5740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5750: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
5760: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
5770: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
5780: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5790: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
57a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
57b0: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
57c0: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
57d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
57e0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
57f0: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
5800: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5810: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
5820: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
5830: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
5840: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
5850: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
5860: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
5870: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
5880: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
5890: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
58a0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
58b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
58d0: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
58e0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
58f0: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
5900: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
5910: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
5920: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
5930: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5940: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
5950: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
5960: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
5970: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
5980: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
5990: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
59a0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
59b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
59c0: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
59d0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
59e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
59f0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a  pJrnl, szJ-16);.
5a00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5a10: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5a20: 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  . .  rc = read32
5a30: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e  bits(pJrnl, &len
5a40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5a50: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5a60: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
5a70: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63  32bits(pJrnl, &c
5a80: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
5a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5aa0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5ab0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5ac0: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b  rnl, aMagic, 8);
5ad0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5ae0: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
5af0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
5b00: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
5b10: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
5b20: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
5b30: 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  l, szJ-16-len);.
5b40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5b50: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5b60: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
5b70: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
5b80: 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69  lloc(len+1);.  i
5b90: 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b  f( !*pzMaster ){
5ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5bb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5bd0: 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73  ad(pJrnl, *pzMas
5be0: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
5bf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5c00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5c10: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5c20: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5c30: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5c40: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
5c50: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
5c60: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
5c70: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
5c80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
5c90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
5ca0: 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29  m -= (*pzMaster)
5cb0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [i];.  }.  if( c
5cc0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
5cd0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
5ce0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
5cf0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
5d00: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
5d10: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
5d20: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
5d40: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
5d50: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
5d60: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
5d70: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
5d80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5d90: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
5da0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
5db0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
5dc0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  me..    */.    s
5dd0: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5de0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5df0: 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ter = 0;.  }else
5e00: 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72  {.    (*pzMaster
5e10: 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  )[len] = '\0';. 
5e20: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
5e30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5e40: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
5e50: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5e60: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
5e70: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
5e80: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
5e90: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
5ea0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
5eb0: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
5ec0: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
5ed0: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
5ee0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
5ef0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
5f00: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
5f10: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
5f20: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
5f30: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
5f40: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
5fd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5fe0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
5ff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
6000: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
6010: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
6020: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
6030: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
6040: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
6050: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
6060: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
6070: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6080: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
6090: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
60a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
60b0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
60c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
60d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
60e0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
60f0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
6100: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6110: 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67  Pager) );.  pPag
6120: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
6130: 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72   offset;.  retur
6140: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  n sqlite3OsSeek(
6150: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6160: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
6170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6180: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6190: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
61a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
61b0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
61c0: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
61d0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
61e0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
61f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6200: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
6210: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
6220: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
6230: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
6240: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
6250: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
6260: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
6270: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
6280: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
6290: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
62a0: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
62b0: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
62c0: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
62d0: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
62e0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
62f0: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
6300: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
6310: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
6320: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
6330: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
6340: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
6350: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
6360: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
6370: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
6380: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6390: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
63a0: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
63b0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
63c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
63d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61   *pPager){.  cha
63e0: 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  r zHeader[sizeof
63f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6400: 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  16];.  int rc;..
6410: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
6420: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
6430: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
6440: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
6450: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
6460: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
6470: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6480: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6490: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
64a0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
64b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
64c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
64d0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
64e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
64f0: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
6500: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
6510: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
6520: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
6530: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
6540: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
6550: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
6560: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
6570: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
6580: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
6590: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
65a0: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
65b0: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
65c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
65d0: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
65e0: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
65f0: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
6600: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65   this..  */.  me
6610: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
6620: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6640: 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52  c));.  /* The nR
6650: 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46  ec Field. 0xFFFF
6660: 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63  FFFF for no-sync
6670: 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
6680: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6690: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
66a0: 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
66b0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
66c0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f  ffffff : 0);.  /
66d0: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
66e0: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
66f0: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
6700: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
6710: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
6720: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
6730: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
6740: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6750: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6760: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
6770: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6780: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
6790: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
67a0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
67b0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
67c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
67d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
67e0: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
67f0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
6800: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
6810: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6820: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6830: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
6840: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
6850: 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  Size);.  IOTRACE
6860: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
6870: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
6880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
6890: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
68a0: 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  r))).  rc = sqli
68b0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
68c0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
68d0: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
68e0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
68f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20  rnal header has 
6900: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63  been written suc
6910: 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20  cessfully. Seek 
6920: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
6930: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6940: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6950: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6960: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20  r sector..  */. 
6970: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6980: 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  OK ){.    IOTRAC
6990: 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c  E(("JTAIL %p %ll
69a0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
69b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
69c0: 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  -1)).    rc = sq
69d0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
69e0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
69f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
6a00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6a10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6a20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6a30: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6a40: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6a50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6a60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6a80: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6a90: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
6aa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6ab0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6ac0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
6ad0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6ae0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6af0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6b00: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
6b10: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6b20: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6b30: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6b40: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6b60: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6b70: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
6b80: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6b90: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
6ba0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
6bb0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6bc0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
6bd0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
6be0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6bf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
6c00: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
6c10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6c20: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6c30: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6c40: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6c50: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6c60: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6c70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
6c80: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6c90: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
6ca0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
6cb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6cc0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
6cd0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6ce0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6cf0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6d00: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6d10: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6d20: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6d30: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6d40: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6d50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6d60: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6d70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6d80: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
6d90: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
6da0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
6db0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6dc0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
6dd0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6de0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6df0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6e00: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6e10: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6e20: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6e30: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6e40: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6e50: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6e60: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6e70: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6e80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6e90: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6ea0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6eb0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6ec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ed0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6ee0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6ef0: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
6f00: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6f10: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
6f20: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6f30: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6f40: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6f50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6f60: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6f70: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6f80: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
6f90: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6fa0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
6fb0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6fc0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
6fd0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
6fe0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6ff0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7000: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7010: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
7020: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7030: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
7040: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7050: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
7060: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
7070: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
7080: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
7090: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
70a0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
70b0: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
70c0: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
70d0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
70e0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
70f0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
7100: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
7110: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
7120: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
7130: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
7140: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
7150: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
7160: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
7170: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
7180: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7190: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
71a0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
71b0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
71c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
71d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
71e0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
71f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
7210: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
7220: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7230: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
7240: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
7250: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
7260: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7270: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
7280: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
7290: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
72a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
72b0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
72c0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
72d0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
72e0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
72f0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
7300: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
7310: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
7320: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
7330: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
7340: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
7350: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
7360: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
7370: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
7380: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
7390: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
73a0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
73b0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
73c0: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
73d0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
73e0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
73f0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
7400: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
7410: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
7420: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
7430: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
7440: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
7450: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
7460: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
7470: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
7480: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
7490: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
74a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
74b0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
74c0: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
74d0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
74e0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
74f0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
7500: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
7510: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
7520: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
7530: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
7540: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
7550: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
7560: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
7570: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7580: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
7590: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
75a0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
75b0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
75c0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
75d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
75e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
75f0: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
7600: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
7610: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
7620: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
7630: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
7640: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
7650: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
7660: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
7670: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
7680: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
7690: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
76a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
76b0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
76c0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
76d0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
76e0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
76f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7700: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
7710: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
7720: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
7730: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
7740: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
7750: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7760: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
7770: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7780: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
7790: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
77a0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
77b0: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
77c0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
77d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
77e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
77f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7800: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7810: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
7820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7830: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7840: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7850: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
7860: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7870: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
7880: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
7890: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
78a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
78b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
78c0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
78d0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
78e0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
78f0: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
7900: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
7910: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
7920: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7930: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7940: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7950: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
7960: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
7970: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
7980: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
7990: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
79a0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
79b0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
79c0: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
79d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
79e0: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
79f0: 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  s the sqlite3Pag
7a00: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a  erStmtCommit().*
7a10: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7a20: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7a30: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
7a40: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
7a50: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
7a60: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
7a70: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
7a80: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
7a90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
7aa0: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
7ab0: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7ac0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7ad0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7ae0: 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79 20  er;.  PgHistory 
7af0: 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
7b00: 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
7b10: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  er);.  assert( M
7b20: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70  EMDB );.  if( !p
7b30: 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a  Hist->inStmt ){.
7b40: 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
7b50: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  t->pPrevStmt==0 
7b60: 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  && pHist->pNextS
7b70: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  tmt==0 );.    if
7b80: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7b90: 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f 54  ){.      PGHDR_T
7ba0: 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e 70  O_HIST(pPager->p
7bb0: 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e 70  Stmt, pPager)->p
7bc0: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a  PrevStmt = pPg;.
7bd0: 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74 2d      }.    pHist-
7be0: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
7bf0: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  ger->pStmt;.    
7c00: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
7c10: 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e  pPg;.    pHist->
7c20: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
7c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7c40: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
7c50: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
7c60: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
7c70: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7c80: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
7c90: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
7ca0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
7cb0: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
7cc0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
7cd0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7ce0: 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20  PgHdr *p;.  if( 
7cf0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30  pPager->aHash==0
7d00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7d10: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
7d20: 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  [pgno & (pPager-
7d30: 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68  >nHash-1)];.  wh
7d40: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
7d50: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
7d60: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
7d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
7d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
7d90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7da0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
7db0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
7dc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7dd0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
7de0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
7df0: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
7e00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
7e10: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7e20: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7e30: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
7e40: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49  ze = -1;.      I
7e50: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
7e60: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
7e70: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7e80: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
7e90: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  UNLOCK;.    pPag
7ea0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
7eb0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  one = 0;.  }.}..
7ec0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
7ed0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
7ee0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
7ef0: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
7f00: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
7f10: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20  file. This is a 
7f20: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
7f30: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
7f40: 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72  ntered.** the er
7f50: 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74  ror-state..*/.st
7f60: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
7f70: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
7f80: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
7f90: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ( p->errCode ) r
7fa0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
7fb0: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
7fc0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e  _RESERVED || p->
7fd0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
7fe0: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65  ;.  if( p->state
7ff0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
8000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
8010: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
8020: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
8030: 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ock(p);.  assert
8040: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
8050: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  !p->journalOpen 
8060: 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65  || (p->exclusive
8070: 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61  Mode&&!p->journa
8080: 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  lOff) );.  asser
8090: 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  t( p->errCode ||
80a0: 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c   !p->stmtOpen ||
80b0: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
80c0: 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  e );.}.../*.** C
80d0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
80e0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
80f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
8100: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
8110: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
8120: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
8130: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
8140: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
8150: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
8160: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
8170: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
8180: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
8190: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
81a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
81b0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
81c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
81d0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
81e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
81f0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
8200: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
8210: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
8220: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
8230: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8240: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
8250: 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
8260: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
8270: 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
8280: 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
8290: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
82a0: 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
82b0: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
82c0: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
82d0: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
82e0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
82f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8300: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
8310: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
8320: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
8330: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
8340: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
8350: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
8360: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  = 0;.  sqliteFre
8370: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
8380: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
8390: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
83a0: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50  >aHash = 0;.  pP
83b0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
83d0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
83e0: 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61  nsaction.  A tra
83f0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
8400: 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61  d by either.** a
8410: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
8420: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LBACK..**.** Whe
8430: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
8440: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
8450: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
8460: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
8470: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
8480: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
8490: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
84a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
84b0: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a   will release.**
84c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
84d0: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
84e0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
84f0: 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68   its place if th
8500: 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70  at is.** the app
8510: 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74  ropriate thing t
8520: 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c  o do.  Release l
8530: 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20  ocks usually is 
8540: 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20  appropriate,.** 
8550: 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e  unless we are in
8560: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
8570: 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73  s mode or unless
8580: 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43   this is a .** C
8590: 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20  OMMIT AND BEGIN 
85a0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20  or ROLLBACK AND 
85b0: 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e  BEGIN operation.
85c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
85d0: 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65  al file is eithe
85e0: 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75  r deleted or tru
85f0: 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  ncated..**.** TO
8600: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
8610: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
8620: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
8630: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8640: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
8650: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
8660: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
8670: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
8680: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
8690: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
86a0: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
86b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
86c0: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
86d0: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
86e0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
86f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8700: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
8710: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8720: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
8730: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8740: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
8750: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
8760: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8770: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
8780: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
8790: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
87a0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
87b0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
87c0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
87d0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
87e0: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
87f0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
8810: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
8820: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
8830: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8840: 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26  ode .          &
8850: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
8860: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
8870: 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49  ->jfd, 0))==SQLI
8880: 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20  TE_OK ){;.      
8890: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
88a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
88b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
88c0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
88d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
88e0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
88f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8900: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
8910: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
8920: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8930: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
8940: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8950: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
8970: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
8980: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  urnal);.      }.
8990: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
89a0: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
89b0: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
89c0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
89d0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
89e0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
89f0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
8a00: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
8a10: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
8a20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
8a30: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
8a40: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
8a50: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61   0;.      pPg->a
8a60: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
8a70: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
8a80: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
8a90: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
8aa0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
8ab0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
8ac0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
8ad0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
8ae0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
8af0: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
8b00: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
8b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8b20: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
8b30: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
8b40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8b50: 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
8b60: 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  | pPager->useJou
8b70: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
8b80: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
8b90: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
8ba0: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
8bb0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
8bc0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
8bd0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
8be0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
8bf0: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
8c00: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8c10: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
8c20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8c30: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
8c40: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
8c50: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8c60: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
8c70: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
8c80: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8c90: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8ca0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
8cb0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
8cc0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
8cd0: 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28   -1;..  return (
8ce0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
8cf0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
8d00: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
8d10: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
8d20: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
8d30: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
8d40: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
8d50: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8d60: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8d70: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8d80: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8d90: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8da0: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
8db0: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
8dc0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
8dd0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
8de0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
8df0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
8e00: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
8e10: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
8e20: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
8e30: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8e40: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
8e50: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8e60: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8e70: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8e80: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8e90: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8ea0: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
8eb0: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
8ec0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
8ed0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
8ee0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
8ef0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
8f00: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
8f10: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
8f20: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
8f30: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
8f40: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8f50: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8f60: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8f70: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8f80: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8f90: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8fa0: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
8fb0: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
8fc0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
8fd0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
8fe0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
8ff0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
9000: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
9010: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
9020: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
9030: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
9040: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
9050: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
9060: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
9070: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
9080: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
9090: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
90a0: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
90b0: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
90c0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
90d0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
90e0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
90f0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
9100: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
9110: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
9120: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
9130: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
9140: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
9150: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
9160: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
9170: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
9180: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
9190: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
91a0: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
91b0: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
91c0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
91d0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
91e0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
91f0: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
9200: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
9210: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
9220: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
9230: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
9240: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
9250: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
9260: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
9270: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
9280: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
9290: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
92a0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
92b0: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
92c0: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
92d0: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
92e0: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
92f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9300: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
9310: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
9320: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
9330: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
9340: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
9350: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
9360: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
9370: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
9380: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
9390: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
93b0: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
93c0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
93d0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
93f0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
9400: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
9410: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
9420: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
9430: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
9440: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
9450: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
9460: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
9470: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
9480: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
9490: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
94a0: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
94b0: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
94c0: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
94d0: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
94e0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
94f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
9500: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
9510: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
9520: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9530: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
9540: 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e  Cksum ? pPager->
9550: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
9560: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
9570: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
9580: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9590: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
95a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
95b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
95c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
95d0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
95e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
95f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9600: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9610: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9620: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
9630: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
9640: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
9650: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
9660: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
9670: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
9680: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
9690: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
96a0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
96b0: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
96c0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
96d0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
96e0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
96f0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
9700: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9710: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
9720: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
9730: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
9740: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
9750: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
9760: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
9770: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
9780: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
9790: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
97a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
97b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
97c0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
97d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
97e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
97f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
9800: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
9810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9820: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
9830: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9840: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
9850: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9860: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
9870: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
9880: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
9890: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
98a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
98b0: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
98c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
98d0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
98e0: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
98f0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9900: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9910: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
9920: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
9930: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
9940: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
9950: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
9960: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
9970: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
9980: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9990: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
99a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
99b0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
99c0: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
99d0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
99e0: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
99f0: 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
9a00: 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
9a10: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
9a20: 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
9a30: 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
9a40: 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
9a50: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
9a60: 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
9a70: 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
9a80: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
9a90: 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
9aa0: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
9ab0: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
9ac0: 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
9ad0: 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
9ae0: 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
9af0: 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
9b00: 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
9b10: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
9b20: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
9b30: 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
9b40: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
9b50: 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
9b60: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
9b70: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
9b80: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
9b90: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
9ba0: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
9bb0: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
9bc0: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
9bd0: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
9be0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
9bf0: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
9c00: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
9c10: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
9c20: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
9c30: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
9c40: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
9c50: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
9c60: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
9c70: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
9c80: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
9c90: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
9ca0: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
9cb0: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
9cc0: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
9cd0: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
9ce0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9cf0: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
9d00: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
9d10: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
9d20: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
9d30: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
9d40: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
9d50: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
9d60: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
9d70: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
9d80: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
9d90: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
9da0: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
9db0: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
9dc0: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
9dd0: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
9de0: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
9df0: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
9e00: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
9e10: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
9e20: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
9e30: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
9e40: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
9e50: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
9e60: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
9e70: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
9e80: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
9e90: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
9ea0: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9eb0: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
9ec0: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
9ed0: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
9ee0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
9ef0: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
9f00: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
9f10: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
9f20: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
9f30: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
9f40: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
9f50: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
9f60: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
9f70: 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE3("PLAYBACK %d
9f80: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
9f90: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
9fa0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
9fb0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9fc0: 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50  EXCLUSIVE && (pP
9fd0: 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65  g==0 || pPg->nee
9fe0: 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20  dSync==0) ){.   
9ff0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
a000: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
a010: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
a020: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a030: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a040: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a050: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a060: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
a070: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
a080: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
a090: 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
a0a0: 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
a0b0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Pg);.    }.  }. 
a0c0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
a0d0: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
a0e0: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
a0f0: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
a100: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
a110: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
a120: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
a130: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
a140: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
a150: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
a160: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
a170: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
a180: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
a190: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
a1a0: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
a1b0: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
a1c0: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
a1d0: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
a1e0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
a1f0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
a200: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
a210: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
a220: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
a230: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
a240: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
a250: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
a260: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a270: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
a280: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
a290: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a2a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
a2b0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
a2c0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a2d0: 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  er(pPg, pPager->
a2e0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a2f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a300: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a310: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a320: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a330: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
a340: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
a350: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
a360: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
a370: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
a380: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
a390: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
a3a0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
a3b0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
a3c0: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
a3d0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
a3e0: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
a3f0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
a400: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
a410: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
a420: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
a430: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
a440: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
a450: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
a460: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20  >pgno, 3);.  }. 
a470: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a480: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
a490: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
a4a0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
a4b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
a4c0: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
a4d0: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
a4e0: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
a4f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
a500: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
a510: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
a520: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
a530: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
a540: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
a550: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a560: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
a570: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
a580: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
a590: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
a5a0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
a5b0: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
a5c0: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
a5d0: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
a5e0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
a5f0: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
a600: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
a610: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
a620: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
a630: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
a640: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
a650: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
a660: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
a670: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
a680: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
a690: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
a6a0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
a6b0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
a6c0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
a6d0: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
a6e0: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
a6f0: 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30  File *master = 0
a700: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
a710: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
a720: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
a730: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a740: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
a750: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
a760: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
a770: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
a780: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
a790: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a7a0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
a7b0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
a7c0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
a7d0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
a7e0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
a7f0: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
a800: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
a810: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ence..  */.  rc 
a820: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
a830: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
a840: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 61 73 73   &master);.  ass
a850: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a860: 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20 29 3b 0a  OK || master );.
a870: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a880: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a890: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
a8a0: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
a8b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
a8c0: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
a8d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a8e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a8f0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a900: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
a910: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
a920: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
a930: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
a940: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
a950: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
a960: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
a970: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
a980: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
a990: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
a9a0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a9b0: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
a9c0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
a9d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
a9e0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
a9f0: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
aa00: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
aa10: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
aa20: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
aa30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
aa40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
aa50: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
aa60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
aa70: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
aa80: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
aa90: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
aaa0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
aab0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
aac0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
aad0: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
aae0: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
aaf0: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
ab00: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
ab10: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
ab20: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
ab30: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
ab40: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
ab50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
ab60: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
ab70: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
ab80: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
ab90: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
aba0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
abb0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
abc0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
abd0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
abe0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
abf0: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
ac00: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
ac10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ac20: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ac30: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
ac40: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
ac50: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
ac60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
ac70: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
ac80: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
ac90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aca0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
acb0: 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  | journal );.   
acc0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
acd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ace0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
acf0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ad00: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
ad10: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ad20: 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  l(journal, &zMas
ad30: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
ad40: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
ad50: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
ad60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ad70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ad80: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ad90: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ada0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
adb0: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
adc0: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
add0: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
ade0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
adf0: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
ae00: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
ae10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
ae20: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
ae30: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
ae40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ae50: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
ae60: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
ae70: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
ae80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
ae90: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
aea0: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
aeb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
aec0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
aed0: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
aee0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
aef0: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
af00: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
af10: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
af20: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
af30: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
af40: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
af50: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
af60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
af70: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
af80: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
af90: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
afa0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
afb0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
afc0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
afd0: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
afe0: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
aff0: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
b000: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
b010: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
b020: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
b030: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b040: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
b050: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
b060: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
b070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
b080: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
b090: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
b0a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
b0b0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
b0c0: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
b0d0: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
b0e0: 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69  )nPage);.  }.  i
b0f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b100: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b110: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
b120: 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
b130: 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
b140: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b150: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
b160: 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66  the sectorSize f
b170: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
b180: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
b190: 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65  ctor size is the
b1a0: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 73   larger of the s
b1b0: 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72  ector size repor
b1c0: 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
b1d0: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20  3OsSectorSize() 
b1e0: 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a 65  and the pageSize
b1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b200: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
b210: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b220: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
b230: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
b240: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
b250: 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 70 50 61  ->fd);.  if( pPa
b260: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
b270: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b280: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b290: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61  sectorSize = pPa
b2a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
b2b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
b2c0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
b2d0: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
b2e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
b2f0: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
b300: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
b310: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
b320: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
b330: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
b340: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
b350: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
b360: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
b370: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
b380: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
b390: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
b3a0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b3b0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b3c0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b3d0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
b3e0: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
b3f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
b400: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
b410: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
b420: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
b430: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
b440: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
b450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
b460: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
b470: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
b480: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b490: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b4a0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
b4b0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
b4c0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
b4d0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b4e0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b4f0: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
b500: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
b510: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
b520: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
b530: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
b540: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b550: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b560: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
b570: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
b580: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
b590: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
b5a0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
b5b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b5c0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
b5d0: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
b5e0: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
b5f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b600: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
b610: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
b620: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
b630: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
b640: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
b650: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
b660: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
b670: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
b680: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
b690: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
b6a0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
b6b0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
b6c0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
b6d0: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
b6e0: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
b6f0: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
b700: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
b710: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
b720: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
b730: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
b740: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
b750: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
b760: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
b770: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
b780: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
b790: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
b7a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b7b0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
b7c0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
b7d0: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
b7e0: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
b7f0: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
b800: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
b810: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
b820: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
b830: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
b840: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
b850: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b860: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
b870: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
b880: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
b890: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
b8a0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
b8b0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
b8c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
b8d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
b8e0: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
b8f0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
b900: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
b910: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
b920: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
b930: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
b940: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
b950: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b960: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
b970: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
b980: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
b990: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
b9a0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
b9b0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
b9c0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
b9d0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
b9e0: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
b9f0: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
ba00: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
ba10: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
ba20: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
ba30: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
ba40: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
ba50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
ba60: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
ba70: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
ba80: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
ba90: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
baa0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
bab0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
bac0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
bad0: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
bae0: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
baf0: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
bb00: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
bb10: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
bb20: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
bb30: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
bb40: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
bb50: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
bb60: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
bb70: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
bb80: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
bb90: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
bba0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
bbb0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
bbc0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
bbd0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
bbe0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
bbf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
bc00: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
bc10: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
bc20: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
bc30: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
bc40: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
bc50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
bc60: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
bc70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
bc80: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
bc90: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
bca0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
bcb0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
bcc0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
bcd0: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
bce0: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
bcf0: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
bd00: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
bd10: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
bd20: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
bd30: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
bd40: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
bd50: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
bd60: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
bd70: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
bd80: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bda0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bdb0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
bdc0: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bde0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
bdf0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
be00: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
be30: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
be40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
be50: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
be60: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
be70: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
be80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
be90: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bea0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
beb0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
bec0: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
bed0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
bee0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
bef0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
bf00: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
bf10: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
bf20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
bf30: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
bf40: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
bf50: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
bf60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bf70: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
bf80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bf90: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bfa0: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
bfb0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bfc0: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
bfd0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bfe0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
bff0: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
c000: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
c010: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
c020: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
c030: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
c040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c050: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
c060: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
c070: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
c080: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
c090: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
c0a0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
c0b0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
c0c0: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
c0d0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
c0e0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
c0f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
c100: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
c110: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c120: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c130: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
c140: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
c150: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
c160: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
c170: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
c180: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
c190: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
c1a0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
c1b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c1c0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c1d0: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
c1e0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
c1f0: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
c200: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
c210: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
c220: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
c230: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
c240: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
c250: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
c260: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
c270: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
c280: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
c290: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
c2a0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
c2b0: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
c2c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c2d0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
c2e0: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
c2f0: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
c300: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c310: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
c320: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
c330: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
c340: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
c350: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
c360: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
c370: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
c380: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
c390: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
c3a0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
c3b0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
c3c0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
c3d0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
c3e0: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
c3f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c400: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
c410: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c420: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c430: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
c440: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c450: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
c460: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
c470: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
c480: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
c490: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
c4a0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
c4b0: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
c4c0: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
c4d0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
c4e0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c4f0: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
c500: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
c510: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
c520: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c530: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
c540: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
c550: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
c560: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
c570: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c580: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
c590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c5a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c5b0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
c5c0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
c5d0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
c5e0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c5f0: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
c600: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c610: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c620: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
c630: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
c640: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
c650: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
c660: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e  .    ** process.
c670: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
c680: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
c690: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69  urnal file consi
c6a0: 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f  sts of.    ** jo
c6b0: 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20  urnalled copies 
c6c0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  of pages that ne
c6d0: 65 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61  ed to be read ba
c6e0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ck into the cach
c6f0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c700: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
c710: 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Hot ){.      nRe
c720: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
c730: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
c740: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c750: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c760: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c770: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
c780: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
c790: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
c7a0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
c7b0: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
c7c0: 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c  to it's original
c7d0: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
c7e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c7f0: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c800: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c810: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
c820: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c830: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
c840: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c850: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c860: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c870: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c880: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
c890: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c8a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c8b0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c8c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
c8d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c8e0: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
c8f0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c900: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c910: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
c920: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
c930: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c940: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c950: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c960: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
c970: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c980: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
c990: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c9a0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
c9b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c9d0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c9e0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
c9f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ca00: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
ca10: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
ca20: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
ca30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ca40: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
ca50: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
ca60: 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
ca70: 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  }.  if( zMaster 
ca80: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
ca90: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
caa0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
cab0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
cac0: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
cad0: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
cae0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
caf0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
cb00: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
cb10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
cb20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
cb30: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
cb40: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
cb50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
cb60: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
cb70: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
cb80: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
cb90: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
cba0: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
cbb0: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
cbc0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
cbd0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
cbe0: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
cbf0: 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
cc00: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
cc10: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
cc20: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
cc30: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
cc40: 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
cc50: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
cc60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
cc70: 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
cc80: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
cc90: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
cca0: 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
ccb0: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
ccc0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
ccd0: 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
cce0: 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
ccf0: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
cd00: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
cd10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
cd20: 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
cd30: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
cd40: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
cd50: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
cd60: 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
cd70: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
cd80: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
cd90: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
cda0: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
cdb0: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
cdc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
cdd0: 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
cde0: 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
cdf0: 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
ce00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
ce10: 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
ce20: 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
ce30: 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
ce40: 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
ce50: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
ce60: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
ce70: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
ce80: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
ce90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
cea0: 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
ceb0: 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
cec0: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cee0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
cef0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
cf20: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
cf30: 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
cf40: 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
cf50: 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
cf60: 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20    i64 os_szJ;.  
cf70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cf80: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
cf90: 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
cfa0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cfb0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
cfc0: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
cfd0: 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
cfe0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
cff0: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
d000: 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20  the offset just 
d010: 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
d020: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
d030: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74  l.  ** page writ
d040: 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66  ten before the f
d050: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
d060: 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  der for this sta
d070: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
d080: 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74  saction was writ
d090: 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ten, or the end 
d0a0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
d0b0: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
d0c0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
d0d0: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
d0e0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
d0f0: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
d100: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
d110: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
d120: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
d130: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
d140: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
d150: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
d160: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
d170: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
d180: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
d190: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
d1a0: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
d1b0: 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
d1c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d1d0: 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
d1e0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d1f0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
d200: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
d210: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
d220: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
d230: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
d240: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
d250: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
d260: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
d270: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
d280: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
d290: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
d2a0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
d2b0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
d2c0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
d2d0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
d2e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
d2f0: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
d300: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d310: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
d320: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
d330: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
d340: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
d350: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
d360: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
d370: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
d380: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
d390: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
d3a0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
d3b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d3c0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d3d0: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
d3e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d3f0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d400: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d410: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d420: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d430: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
d440: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
d450: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
d460: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
d470: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
d480: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
d490: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
d4a0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
d4b0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
d4c0: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
d4d0: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
d4e0: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
d4f0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
d500: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
d510: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
d520: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
d530: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
d540: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
d550: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
d560: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
d570: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
d580: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
d590: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
d5a0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
d5b0: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
d5c0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d5d0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
d5e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
d5f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
d600: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
d610: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d620: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
d630: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d640: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
d650: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
d660: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
d670: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
d680: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
d690: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
d6a0: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
d6b0: 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
d6c0: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d6d0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d6e0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d6f0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d700: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d710: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
d720: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d730: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d740: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
d750: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d760: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d770: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
d780: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
d790: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
d7a0: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
d7b0: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
d7c0: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
d7d0: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
d7e0: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
d7f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d800: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d810: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d820: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
d830: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d840: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
d850: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
d860: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
d870: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
d880: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
d890: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
d8a0: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
d8b0: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
d8c0: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
d8d0: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
d8e0: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
d8f0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d900: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d910: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d920: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d930: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d940: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d950: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d960: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d970: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
d980: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d990: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
d9a0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
d9b0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
d9c0: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
d9d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d9e0: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
d9f0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
da00: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
da10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
da20: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
da30: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
da40: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
da50: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
da60: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
da70: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
da80: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
da90: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
daa0: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
dab0: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
dac0: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
dad0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
dae0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
daf0: 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
db00: 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
db10: 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
db20: 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
db30: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
db40: 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
db50: 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
db60: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
db70: 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
db80: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
db90: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
dba0: 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
dbb0: 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
dbc0: 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
dbd0: 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
dbe0: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
dbf0: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
dc00: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
dc10: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
dc20: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
dc30: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
dc40: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
dc50: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
dc60: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
dc70: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
dc80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
dc90: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
dca0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
dcb0: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
dcc0: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
dcd0: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
dce0: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
dcf0: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
dd00: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
dd10: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
dd20: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
dd30: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
dd40: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
dd50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dd60: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
dd70: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
dd80: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
dd90: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
dda0: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
ddb0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
ddc0: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
ddd0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
dde0: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
ddf0: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
de00: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
de10: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
de20: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
de30: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
de40: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
de50: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
de60: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
de70: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
de80: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
de90: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
deb0: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
dec0: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
ded0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dee0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
def0: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
df00: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
df10: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
df20: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
df30: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
df40: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
df50: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
df60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
df70: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
df80: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
df90: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
dfa0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
dfb0: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
dfc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
dfd0: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
dfe0: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
dff0: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
e000: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e010: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
e020: 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
e030: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
e040: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
e050: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
e060: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
e070: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e080: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
e090: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
e0a0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
e0b0: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
e0c0: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
e0d0: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
e0e0: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
e0f0: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
e100: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
e110: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e120: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
e130: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
e140: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
e150: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
e160: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
e170: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
e180: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
e190: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
e1a0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
e1b0: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
e1c0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
e1d0: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
e1e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e1f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
e200: 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
e210: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
e220: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
e230: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
e240: 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
e250: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
e260: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
e270: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
e280: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
e290: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
e2a0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
e2b0: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
e2c0: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
e2d0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
e2e0: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
e2f0: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
e300: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
e310: 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20  Opentemp(OsFile 
e320: 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e  **pFd){.  int cn
e330: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
e340: 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51  .  char zFile[SQ
e350: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
e360: 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ZE];..#ifdef SQL
e370: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
e380: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
e390: 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
e3a0: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
e3b0: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
e3c0: 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20  endif.  do{.    
e3d0: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
e3e0: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
e3f0: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
e400: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
e410: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
e420: 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pFd, 1);.    ass
e430: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
e440: 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20  OK || *pFd );.  
e450: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
e460: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
e470: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
e480: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
e490: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
e4a0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
e4b0: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
e4c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
e4d0: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
e4e0: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
e4f0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
e500: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
e510: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
e520: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
e530: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
e540: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e550: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
e560: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
e570: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
e580: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
e590: 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
e5a0: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
e5b0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
e5c0: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
e5d0: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
e5e0: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
e5f0: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
e600: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
e610: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
e620: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
e630: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
e640: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
e650: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
e660: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
e670: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
e680: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
e690: 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
e6a0: 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
e6b0: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
e6c0: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
e6d0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
e6e0: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
e6f0: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
e700: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
e710: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
e720: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
e730: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
e740: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
e750: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e760: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
e770: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
e780: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
e790: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
e7a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e7b0: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
e7c0: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
e7d0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
e7e0: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
e7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
e800: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
e810: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
e820: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
e830: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   0;.  char *zFul
e840: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
e850: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f   int nameLen;  /
e860: 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72  * Compiler is wr
e870: 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ong. This is alw
e880: 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
e890: 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20  before use */.  
e8a0: 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a  OsFile *fd = 0;.
e8b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e8c0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
e8d0: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
e8e0: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
e8f0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
e900: 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73  ly = 0;.  int us
e910: 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
e920: 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
e930: 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e  OURNAL)==0;.  in
e940: 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
e950: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
e960: 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20  _READLOCK)!=0;. 
e970: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
e980: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
e990: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
e9a0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
e9b0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
e9c0: 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
e9d0: 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
e9e0: 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
e9f0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
ea00: 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
ea10: 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
ea20: 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
ea30: 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
ea40: 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
ea50: 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
ea60: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
ea70: 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
ea80: 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
ea90: 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
eaa0: 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
eab0: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
eac0: 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64  be set. It would
ead0: 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65   be nice to asse
eae0: 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72  rt.  ** that Thr
eaf0: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69  eadData.nAlloc i
eb00: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20  s non-zero, but 
eb10: 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73  alas this breaks
eb20: 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a   test cases .  *
eb30: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76  * written to inv
eb40: 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69  oke the pager di
eb50: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54  rectly..  */.  T
eb60: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
eb70: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
eb80: 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
eb90: 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a   pTsd );.#endif.
eba0: 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f  .  /* We used to
ebb0: 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28   test if malloc(
ebc0: 29 20 68 61 64 20 61 6c 72 65 61 64 79 20 66 61  ) had already fa
ebd0: 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63  iled before proc
ebe0: 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75  eeding. .  ** Bu
ebf0: 74 20 74 68 65 20 77 61 79 20 74 68 69 73 20 66  t the way this f
ec00: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
ec10: 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20  in SQLite means 
ec20: 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20  that can never. 
ec30: 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74   ** happen. Furt
ec40: 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20  hermore, if the 
ec50: 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
ec60: 61 67 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  ag is already se
ec70: 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  t, .  ** either 
ec80: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
ec90: 74 65 53 74 72 44 75 70 28 29 20 6f 72 20 73 71  teStrDup() or sq
eca0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c  liteMalloc() bel
ecb0: 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69  ow will.  ** fai
ecc0: 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51  l shortly and SQ
ecd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72  LITE_NOMEM retur
ece0: 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f  ned anyway..  */
ecf0: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
ed00: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
ed10: 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73  pager file and s
ed20: 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  et zFullPathname
ed30: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c   to point at mal
ed40: 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65  loc()ed .  ** me
ed50: 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mory containing 
ed60: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c  the complete fil
ed70: 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c  ename (i.e. incl
ed80: 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  uding the direct
ed90: 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ory)..  */.  if(
eda0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
edb0: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
edc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
edd0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
ede0: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
edf0: 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
ee00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
ee10: 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75  b = 1;.      zFu
ee20: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ee30: 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20  iteStrDup("");. 
ee40: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
ee50: 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c      {.      zFul
ee60: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
ee70: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
ee80: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ee90: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
eea0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
eeb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
eec0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
eed0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
eee0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
eef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
ef00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64  =SQLITE_OK || fd
ef10: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
ef20: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
ef30: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ef40: 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20  Opentemp(&fd);. 
ef50: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
ef60: 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b  FileName(zTemp);
ef70: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
ef80: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
ef90: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
efa0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
efb0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
efc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
efd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
efe0: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
eff0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
f000: 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ate the Pager st
f010: 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74  ructure. As part
f020: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c   of the same all
f030: 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ocation, allocat
f040: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
f050: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20   the full paths 
f060: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72  of the file, dir
f070: 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e  ectory and journ
f080: 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e  al .  ** (Pager.
f090: 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72  zFilename, Pager
f0a0: 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  .zDirectory and 
f0b0: 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e  Pager.zJournal).
f0c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
f0d0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
f0e0: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
f0f0: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
f100: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
f110: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
f120: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
f130: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
f140: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 20  .    if( pPager 
f150: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
f160: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f170: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63  ->pTmpSpace = (c
f180: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
f190: 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46  ocRaw(SQLITE_DEF
f1a0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
f1b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
f1c0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f1d0: 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  cured in either 
f1e0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
f1f0: 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65  ove, free the me
f200: 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74  mory .  ** point
f210: 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61  ed to by zFullPa
f220: 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65  thname, free the
f230: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
f240: 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a   and close the .
f250: 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65    ** file. Since
f260: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
f270: 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72  t allocated ther
f280: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
f290: 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61  set .  ** any Pa
f2a0: 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69  ger.errMask vari
f2b0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ables..  */.  if
f2c0: 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46  ( !pPager || !zF
f2d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21  ullPathname || !
f2e0: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f2f0: 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  e || rc!=SQLITE_
f300: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
f310: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
f320: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
f330: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f340: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
f350: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
f360: 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
f370: 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
f380: 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
f390: 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
f3a0: 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
f3b0: 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61  EID(fd), zFullPa
f3c0: 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  thname);.  IOTRA
f3d0: 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
f3e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c  n", pPager, zFul
f3f0: 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50  lPathname)).  pP
f400: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
f410: 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  = (char*)&pPager
f420: 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  [1];.  pPager->z
f430: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
f440: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
f450: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61  ameLen+1];.  pPa
f460: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
f470: 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
f480: 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ory[nameLen+1];.
f490: 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
f4a0: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c  >zFilename, zFul
f4b0: 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d 65 4c  lPathname, nameL
f4c0: 65 6e 2b 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28  en+1);.  memcpy(
f4d0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f4e0: 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ry, zFullPathnam
f4f0: 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b 0a 0a  e, nameLen+1);..
f500: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
f510: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
f520: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
f530: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
f540: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
f550: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
f560: 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70   = 0;.  memcpy(p
f570: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
f580: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e   zFullPathname,n
f590: 61 6d 65 4c 65 6e 29 3b 0a 20 20 73 71 6c 69 74  ameLen);.  sqlit
f5a0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
f5b0: 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ame);.  memcpy(&
f5c0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f5d0: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
f5e0: 72 6e 61 6c 22 2c 73 69 7a 65 6f 66 28 22 2d 6a  rnal",sizeof("-j
f5f0: 6f 75 72 6e 61 6c 22 29 29 3b 0a 20 20 70 50 61  ournal"));.  pPa
f600: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
f610: 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
f620: 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
f630: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
f640: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
f650: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
f660: 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
f670: 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
f680: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f690: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
f6a0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f6b0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
f6c0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f6d0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
f6e0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
f6f0: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
f700: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f710: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
f720: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
f730: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
f740: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f750: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
f760: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f770: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
f780: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
f790: 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
f7a0: 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
f7b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
f7c0: 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65 72 74 28  COUNT;.  assert(
f7d0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30   PAGER_UNLOCK==0
f7e0: 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
f7f0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
f800: 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
f810: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
f820: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
f830: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
f840: 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
f850: 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
f860: 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
f870: 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
f880: 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
f890: 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
f8a0: 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
f8b0: 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
f8c0: 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
f8d0: 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
f8e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
f8f0: 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
f900: 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
f910: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
f920: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
f930: 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
f940: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
f950: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
f960: 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
f970: 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
f980: 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
f990: 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
f9a0: 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
f9b0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
f9c0: 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
f9d0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
f9e0: 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
f9f0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
fa00: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
fa10: 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43  r->nExtra = FORC
fa20: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74  E_ALIGNMENT(nExt
fa30: 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64  ra);.  assert(fd
fa40: 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20  ||memDb);.  if( 
fa50: 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65  !memDb ){.    se
fa60: 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
fa70: 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  er);.  }.  /* pP
fa80: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
fa90: 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
faa0: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
fab0: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
fac0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
fad0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
fae0: 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
faf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
fb00: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
fb10: 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20    pPager->pNext 
fb20: 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a  = pTsd->pPager;.
fb30: 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
fb40: 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a   pPager;.#endif.
fb50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
fb70: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
fb80: 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
fb90: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
fba0: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50  SetBusyhandler(P
fbb0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
fbc0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
fbd0: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
fbe0: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
fbf0: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
fc00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
fc10: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
fc20: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
fc30: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
fc40: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
fc50: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
fc60: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
fc70: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
fc80: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
fc90: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
fca0: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
fcb0: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
fcc0: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
fcd0: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
fce0: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
fcf0: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
fd00: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
fd10: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
fd20: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
fd30: 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  .  .** Destructo
fd40: 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c  rs are only call
fd50: 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  ed by sqlite3Pag
fd60: 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  erUnref()..*/.vo
fd70: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
fd80: 65 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67  etDestructor(Pag
fd90: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
fda0: 20 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65   (*xDesc)(DbPage
fdb0: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
fdc0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
fdd0: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
fde0: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
fdf0: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
fe00: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
fe10: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
fe20: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
fe30: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
fe40: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
fe50: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
fe60: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
fe70: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
fe80: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
fe90: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
fea0: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
feb0: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
fec0: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
fed0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
fee0: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
fef0: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
ff00: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
ff10: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
ff20: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
ff30: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
ff40: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
ff50: 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  nit)(DbPage*,int
ff60: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
ff70: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
ff80: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
ff90: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
ffa0: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
ffb0: 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
ffc0: 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
ffd0: 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
ffe0: 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
fff0: 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
10000 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
10010 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
10020 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10030 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
10040 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
10050 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
10060 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
10070 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
10080 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
10090 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
100a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
100b0 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  b && pPager->nRe
100c0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65  f==0 ){.    page
100d0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
100e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67  .    pPager->pag
100f0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
10100 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  ;.    pPager->pT
10110 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
10120 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  3ReallocOrFree(p
10130 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
10140 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  , pageSize);.  }
10150 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
10160 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
10170 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
10180 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
10190 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
101a0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
101b0 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
101c0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
101d0 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
101e0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
101f0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
10200 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
10210 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
10220 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
10230 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10240 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
10250 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
10260 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
10270 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
10280 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
10290 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
102a0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
102b0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
102c0 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
102d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
102e0 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
102f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
10300 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
10310 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  er);.  return pP
10320 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
10330 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
10340 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
10350 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
10360 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
10370 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
10380 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
10390 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
103a0 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
103b0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
103c0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
103d0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
103e0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
103f0 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
10400 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
10410 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
10420 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
10430 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
10440 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
10450 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
10460 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
10470 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10480 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
10490 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
104a0 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
104b0 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
104c0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
104d0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
104e0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
104f0 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
10500 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
10510 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
10520 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
10530 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
10540 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10550 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
10560 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10570 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
10580 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
10590 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
105a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
105b0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
105c0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
105d0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
105e0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
105f0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
10600 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
10610 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
10620 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
10630 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
10640 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72   .**.** No error
10650 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
10660 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20  e. The rational 
10670 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
10680 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   this function .
10690 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ** may be called
106a0 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
106b0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
106c0 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65   or contain a he
106d0 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65  ader. In .** the
106e0 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33  se cases sqlite3
106f0 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65  OsRead() will re
10700 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74  turn an error, t
10710 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  o which the corr
10720 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65  ect .** response
10730 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20   is to zero the 
10740 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20  memory at pDest 
10750 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41  and continue.  A
10760 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a   real IO error .
10770 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62  ** will presumab
10780 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20  ly recur and be 
10790 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20  picked up later 
107a0 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f  (Todo: Think abo
107b0 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74  ut this)..*/.int
107c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
107d0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
107e0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
107f0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
10800 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
10810 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10820 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
10830 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  , N);.  if( MEMD
10840 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61  B==0 ){.    disa
10850 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10860 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
10870 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
10880 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
10890 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
108a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
108b0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
108c0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
108d0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
108e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
108f0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
10900 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28  est, N);.    if(
10910 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
10920 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
10930 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10940 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
10950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10960 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10970 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
10980 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
10990 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
109a0 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
109b0 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
109c0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
109d0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
109e0 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
109f0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
10a00 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
10a10 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
10a20 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
10a30 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
10a40 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
10a50 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
10a60 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
10a70 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
10a80 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
10a90 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
10aa0 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
10ab0 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
10ac0 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
10ad0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
10ae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
10af0 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72    i64 n;.  int r
10b00 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
10b10 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
10b20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
10b30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
10b40 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
10b50 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
10b60 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
10b70 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
10b80 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d   {.    if( (rc =
10b90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10ba0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
10bb0 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
10bc0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
10bd0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
10be0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10bf0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
10c00 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
10c10 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
10c20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
10c30 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
10c40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10c50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10c60 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
10c70 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
10c80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10c90 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
10ca0 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
10cb0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
10cc0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
10cd0 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    n++;.  }.  if(
10ce0 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e   n>pPager->mxPgn
10cf0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
10d00 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d  >mxPgno = n;.  }
10d10 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
10d20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10d30 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
10d40 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
10d50 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
10d60 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
10d70 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
10d80 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
10d90 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
10da0 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
10db0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
10dc0 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
10dd0 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
10de0 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
10df0 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
10e00 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
10e10 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
10e20 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
10e30 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
10e40 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
10e50 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
10e60 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
10e70 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
10e80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
10e90 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
10ea0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
10eb0 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
10ec0 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
10ed0 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
10ee0 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
10ef0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
10f00 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
10f10 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
10f20 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
10f30 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
10f40 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
10f50 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
10f60 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
10f70 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
10f80 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
10f90 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
10fa0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
10fb0 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
10fc0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
10fd0 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
10fe0 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
10ff0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
11000 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
11010 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
11020 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
11030 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
11040 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
11050 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
11060 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
11070 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
11080 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
11090 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
110a0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
110b0 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
110c0 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
110d0 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
110e0 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
110f0 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
11100 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
11110 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
11120 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
11130 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
11140 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
11150 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
11160 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
11170 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
11180 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
11190 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
111a0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
111b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
111c0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
111d0 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
111e0 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
111f0 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
11200 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
11210 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
11220 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
11230 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
11240 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
11250 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
11260 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
11270 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
11280 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
11290 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
112a0 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
112b0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
112c0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
112d0 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
112e0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
112f0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
11300 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
11310 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
11320 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
11330 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
11340 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
11350 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
11360 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
11370 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
11380 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
11390 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
113a0 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
113b0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
113c0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
113d0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
113e0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
113f0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
11400 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
11410 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
11420 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
11430 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
11440 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
11450 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
11460 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
11470 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
11480 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
11490 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
114a0 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
114b0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
114c0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
114d0 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
114e0 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
114f0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
11500 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
11510 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f  ager, pPg);.}../
11520 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11530 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
11540 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 20  ncate the cache 
11550 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a  when a database.
11560 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e  ** is truncated.
11570 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20    Drop from the 
11580 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20  cache all pages 
11590 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a  whose pgno is.**
115a0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
115b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20  ger->dbSize and 
115c0 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e  is unreferenced.
115d0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
115e0 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
115f0 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
11600 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
11610 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61  *.** Actually, a
11620 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
11630 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
11640 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a  ed, it would be.
11650 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68  ** an error to h
11660 61 76 65 20 61 20 72 65 66 65 72 65 6e 63 65 64  ave a referenced
11670 20 70 61 67 65 2e 20 20 42 75 74 20 72 61 74 68   page.  But rath
11680 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a  er than delete.*
11690 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e 64 20  * that page and 
116a0 67 75 61 72 61 6e 74 65 65 20 61 20 73 75 62 73  guarantee a subs
116b0 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c  equent segfault,
116c0 20 69 74 20 73 65 65 6d 73 20 62 65 74 74 65 72   it seems better
116d0 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61  .** to zero it a
116e0 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77 65 20  nd hope that we 
116f0 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79  error out sanely
11700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11710 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
11720 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
11730 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
11740 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
11750 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
11760 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
11770 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
11780 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
11790 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
117a0 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
117b0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
117c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
117d0 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
117e0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
117f0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
11800 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
11810 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
11820 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
11830 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
11840 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
11850 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
11860 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
11870 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
11880 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52    IOTRACE(("PGFR
11890 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  EE %p %d\n", pPa
118a0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
118b0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
118c0 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
118d0 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a  _pgfree_count);.
118e0 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
118f0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b  (pPg);.      mak
11900 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
11910 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
11920 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
11930 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
11940 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
11950 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
11960 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
11970 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
11980 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
11990 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
119a0 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
119b0 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  e.  Repeat until
119c0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
119d0 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
119e0 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
119f0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
11a00 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
11a10 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
11a20 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
11a30 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
11a40 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
11a50 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
11a60 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
11a70 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
11a80 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
11a90 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
11aa0 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
11ab0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
11ac0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
11ad0 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
11ae0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
11af0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
11b00 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
11b10 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
11b20 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
11b30 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
11b40 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
11b50 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
11b60 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11b70 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
11b80 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
11b90 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
11ba0 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73   unknown */.  as
11bb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11bc0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11bd0 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
11be0 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29  ize<0 || MEMDB )
11bf0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
11c00 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
11c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11c20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
11c30 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11c40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
11c50 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
11c60 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
11c70 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
11c80 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74 65 33  _BUSY && sqlite3
11c90 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
11ca0 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
11cb0 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69  andler) );.    i
11cc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11cd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
11ce0 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
11cf0 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
11d00 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
11d10 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
11d20 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
11d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11d40 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
11d50 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
11d60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
11d70 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
11d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
11d90 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
11da0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
11db0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
11dc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11dd0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
11de0 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20  D || MEMDB );.  
11df0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11e00 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
11e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
11e20 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
11e30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
11e50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
11e60 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
11e70 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
11e80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11e90 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  OK;.  }.  if( ME
11ea0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
11eb0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
11ec0 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
11ed0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
11ee0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
11ef0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11f00 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
11f10 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
11f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11f30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11f40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
11f50 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11f60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
11f70 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
11f80 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
11f90 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11fa0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
11fb0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
11fc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11fe0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
11ff0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
12000 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  r, nPage);.  ret
12010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12020 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
12030 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
12040 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
12050 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
12060 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
12070 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
12080 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
12090 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
120a0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
120b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
120c0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
120d0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
120e0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
120f0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
12100 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
12110 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
12120 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
12130 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
12140 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
12150 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12160 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
12170 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
12180 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
12190 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
121a0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
121b0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
121c0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
121d0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
121e0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
121f0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
12200 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
12210 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
12220 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
12230 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
12240 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
12250 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
12260 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
12270 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
12280 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
12290 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
122a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
122b0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
122c0 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
122d0 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
122e0 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
122f0 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
12300 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
12310 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
12320 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
12330 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
12340 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
12350 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
12360 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
12370 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
12380 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
12390 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
123a0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
123b0 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
123c0 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
123d0 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  t..  */.  Thread
123e0 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
123f0 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
12400 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12410 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
12420 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41  pTsd && pTsd->nA
12430 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  lloc );.#endif..
12440 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
12450 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
12460 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  .  pPager->errCo
12470 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  de = 0;.  pPager
12480 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12490 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73  = 0;.  pager_res
124a0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61  et(pPager);.  pa
124b0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
124c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
124d0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
124e0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
124f0 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f  PAGERTRACE2("CLO
12500 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
12510 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
12520 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
12530 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
12540 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12550 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
12560 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
12570 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
12580 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
12590 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
125a0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
125b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
125c0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
125d0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
125e0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
125f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
12600 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
12610 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
12620 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
12630 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
12640 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
12650 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
12660 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
12670 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
12680 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
12690 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
126a0 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
126b0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
126c0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
126d0 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64   ** }.  */..#ifd
126e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
126f0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
12700 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  NT.  /* Remove t
12710 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68  he pager from th
12720 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
12730 20 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67   pagers starting
12740 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64   at .  ** Thread
12750 44 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d  Data.pPager if m
12760 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
12770 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a   is enabled..  *
12780 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  /.  if( pPager==
12790 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a  pTsd->pPager ){.
127a0 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72      pTsd->pPager
127b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
127c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
127d0 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  ager *pTmp;.    
127e0 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d  for(pTmp = pTsd-
127f0 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70  >pPager; pTmp->p
12800 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54  Next!=pPager; pT
12810 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b  mp=pTmp->pNext){
12820 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78  }.    pTmp->pNex
12830 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
12840 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  t;.  }.#endif.  
12850 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
12860 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c  r->aHash);.  sql
12870 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
12880 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
12890 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
128a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
128b0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
128c0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
128d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
128e0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
128f0 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
12900 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
12910 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
12920 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
12930 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
12940 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
12950 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  p->pgno;.}.#endi
12960 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  f../*.** The pag
12970 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
12980 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
12990 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
129a0 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
129b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
129c0 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
129d0 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
129e0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
129f0 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
12a00 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
12a10 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
12a20 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
12a30 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
12a40 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
12a50 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
12a60 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
12a70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
12a80 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
12a90 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
12aa0 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
12ab0 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
12ac0 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
12ad0 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
12ae0 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
12af0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
12b00 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
12b10 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
12b20 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
12b30 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
12b40 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
12b50 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
12b60 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
12b70 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
12b80 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
12b90 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
12ba0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
12bb0 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
12bc0 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
12bd0 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
12be0 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
12bf0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
12c00 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
12c10 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
12c20 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
12c30 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
12c40 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
12c50 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c70 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12c80 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
12c90 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
12ca0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
12cb0 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
12cc0 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
12cd0 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
12ce0 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
12cf0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
12d00 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
12d10 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
12d20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
12d30 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
12d40 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
12d50 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
12d60 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12d70 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
12d80 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
12d90 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
12da0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
12db0 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
12dc0 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
12dd0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
12de0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
12df0 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
12e00 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
12e10 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
12e20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
12e30 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
12e40 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
12e50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
12e60 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
12e70 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
12e80 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
12e90 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
12ea0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
12eb0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
12ec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12ed0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
12ee0 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  ){.  page_ref(pP
12ef0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
12f00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12f10 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
12f20 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
12f30 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
12f40 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
12f50 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
12f60 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
12f70 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
12f80 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
12f90 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
12fa0 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
12fb0 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
12fc0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
12fd0 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
12fe0 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
12ff0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
13000 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
13010 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13020 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
13030 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
13040 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
13050 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
13060 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
13070 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
13080 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
13090 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
130a0 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
130b0 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
130c0 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
130d0 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
130e0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
130f0 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
13100 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
13110 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
13120 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
13130 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
13140 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
13150 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
13160 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
13170 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
13180 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
13190 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
131a0 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
131b0 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
131c0 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
131d0 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
131e0 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
131f0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
13200 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
13210 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
13220 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
13230 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
13240 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
13250 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
13260 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
13270 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
13280 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
13290 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
132a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
132b0 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
132c0 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
132d0 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
132e0 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
132f0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
13300 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
13310 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
13320 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
13330 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13340 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
13350 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
13360 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
13370 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
13380 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
13390 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
133a0 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
133b0 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
133c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
133d0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
133e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
133f0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
13400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13410 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
13420 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
13430 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
13440 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
13450 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
13460 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
13470 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
13480 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
13490 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
134a0 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
134b0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
134c0 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
134d0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
134e0 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
134f0 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
13500 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
13510 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
13520 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
13530 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
13540 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13550 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
13560 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a         i64 jSz;.
13570 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13580 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
13590 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
135a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
135b0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
135c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
135d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
135e0 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  lOff==jSz );.   
135f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13600 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57    {.        /* W
13610 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
13620 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
13630 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
13640 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
13650 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
13660 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
13670 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
13680 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
13690 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
136a0 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
136b0 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
136c0 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
136d0 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
136e0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
136f0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
13700 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20  rollback. .     
13710 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
13720 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
13730 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
13740 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
13750 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
13760 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
13770 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
13780 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
13790 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
137a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
137b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
137c0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
137d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
137e0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
137f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
13810 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
13820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13830 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
13840 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
13850 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
13860 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
13870 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13880 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f 54   rc;.        IOT
13890 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
138a0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
138b0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
138c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
138d0 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
138e0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c  (aJournalMagic),
138f0 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63 20   4)).        rc 
13900 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
13910 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13920 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
13930 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13940 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  n rc;..        r
13950 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
13960 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
13970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13980 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
13990 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
139a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41        }.      PA
139b0 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
139c0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
139d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
139e0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
139f0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
13a00 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
13a10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
13a20 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
13a30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
13a40 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
13a50 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
13a60 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13a70 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
13a80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
13a90 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
13aa0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
13ab0 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
13ac0 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
13ad0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
13ae0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
13af0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
13b00 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
13b10 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
13b20 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
13b30 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
13b40 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
13b50 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
13b60 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
13b70 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
13b80 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
13b90 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
13ba0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
13bb0 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
13bc0 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
13bd0 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
13be0 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
13bf0 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
13c00 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
13c10 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
13c20 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
13c30 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
13c40 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
13c50 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
13c60 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
13c70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13c80 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
13c90 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
13ca0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
13cb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13cc0 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74  * Merge two list
13cd0 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65  s of pages conne
13ce0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61  cted by pDirty a
13cf0 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72  nd in pgno order
13d00 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68  ..** Do not both
13d10 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65   fixing the pPre
13d20 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  vDirty pointers.
13d30 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
13d40 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74   *merge_pagelist
13d50 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64  (PgHdr *pA, PgHd
13d60 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20  r *pB){.  PgHdr 
13d70 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a  result, *pTail;.
13d80 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c    pTail = &resul
13d90 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26  t;.  while( pA &
13da0 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20  & pB ){.    if( 
13db0 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e  pA->pgno<pB->pgn
13dc0 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  o ){.      pTail
13dd0 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
13de0 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b       pTail = pA;
13df0 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e  .      pA = pA->
13e00 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
13e10 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  e{.      pTail->
13e20 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20  pDirty = pB;.   
13e30 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20     pTail = pB;. 
13e40 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44       pB = pB->pD
13e50 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
13e60 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20    if( pA ){.    
13e70 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13e80 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pA;.  }else if( 
13e90 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pB ){.    pTail-
13ea0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
13eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c  }else{.    pTail
13ec0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13ed0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c  }.  return resul
13ee0 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  t.pDirty;.}../*.
13ef0 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74  ** Sort the list
13f00 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63   of pages in acc
13f10 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
13f20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65  pgno.  Pages are
13f30 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  .** connected by
13f40 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73   pDirty pointers
13f50 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74  .  The pPrevDirt
13f60 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a  y pointers are.*
13f70 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74  * corrupted by t
13f80 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65  his sort..*/.#de
13f90 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
13fa0 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66  ET_ALLOC 25.#def
13fb0 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
13fc0 54 20 20 20 20 20 20 20 32 35 0a 23 69 66 64 65  T       25.#ifde
13fd0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
13fe0 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
13ff0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20  r_n_sort_bucket 
14000 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f  = 0;.  #undef N_
14010 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64  SORT_BUCKET.  #d
14020 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
14030 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65  KET \.   (sqlite
14040 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62  3_pager_n_sort_b
14050 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61  ucket?sqlite3_pa
14060 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
14070 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  t:N_SORT_BUCKET_
14080 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74  ALLOC).#endif.st
14090 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74  atic PgHdr *sort
140a0 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
140b0 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a  *pIn){.  PgHdr *
140c0 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  a[N_SORT_BUCKET_
140d0 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e  ALLOC], *p;.  in
140e0 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c  t i;.  memset(a,
140f0 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a   0, sizeof(a));.
14100 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a    while( pIn ){.
14110 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20      p = pIn;.   
14120 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79   pIn = p->pDirty
14130 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
14140 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
14150 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ; i<N_SORT_BUCKE
14160 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  T-1; i++){.     
14170 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a   if( a[i]==0 ){.
14180 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70          a[i] = p
14190 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
141a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
141b0 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f        p = merge_
141c0 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70  pagelist(a[i], p
141d0 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  );.        a[i] 
141e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
141f0 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f   }.    if( i==N_
14200 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b  SORT_BUCKET-1 ){
14210 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61  .      /* Covera
14220 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c  ge: To get here,
14230 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62   there need to b
14240 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b  e 2^(N_SORT_BUCK
14250 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c  ET) .      ** el
14260 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
14270 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69  put list. This i
14280 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20  s possible, but 
14290 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20  impractical..   
142a0 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68     ** Testing th
142b0 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70  is line is the p
142c0 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76  oint of global v
142d0 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  ariable.      **
142e0 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
142f0 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20  _sort_bucket..  
14300 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69      */.      a[i
14310 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  ] = merge_pageli
14320 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
14330 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30   }.  }.  p = a[0
14340 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  ];.  for(i=1; i<
14350 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69  N_SORT_BUCKET; i
14360 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72  ++){.    p = mer
14370 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61  ge_pagelist(p, a
14380 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  [i]);.  }.  retu
14390 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
143a0 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
143b0 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
143c0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
143d0 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
143e0 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
143f0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
14400 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
14410 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
14420 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
14430 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
14440 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
14450 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
14460 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
14470 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
14480 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
14490 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
144a0 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
144b0 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
144c0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
144d0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
144e0 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
144f0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
14500 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
14510 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
14520 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
14530 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
14540 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
14550 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
14560 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
14570 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
14580 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
14590 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
145a0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
145b0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
145c0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
145d0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
145e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
145f0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
14600 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
14610 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
14620 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
14630 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
14640 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
14650 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
14660 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
14670 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
14680 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
14690 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
146a0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
146b0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
146c0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
146d0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
146e0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
146f0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
14700 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
14710 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
14720 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
14730 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
14740 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
14750 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
14760 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
14770 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
14780 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
14790 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
147a0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
147b0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
147c0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
147d0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
147e0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
147f0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
14800 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
14810 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
14820 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
14830 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
14840 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
14850 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
14860 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
14870 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14880 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14890 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f   }..  pList = so
148a0 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73  rt_pagelist(pLis
148b0 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  t);.  while( pLi
148c0 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
148d0 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
148e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
148f0 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
14900 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e  >fd, (pList->pgn
14910 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
14920 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
14930 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14940 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74   rc;.    /* If t
14950 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
14960 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
14970 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
14980 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
14990 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
149a0 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
149b0 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
149c0 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73  erTruncate() was
149d0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
149e0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
149f0 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
14a00 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
14a10 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
14a20 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
14a30 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
14a40 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
14a50 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
14a60 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
14a70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Size ){.      ch
14a80 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
14a90 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C2(pPager, PGHDR
14aa0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
14ab0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
14ac0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
14ad0 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE3("STORE %d pa
14ae0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14af0 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14b00 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49  ->pgno);.      I
14b10 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
14b20 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
14b30 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a   pList->pgno));.
14b40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14b50 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
14b60 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
14b70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14b80 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
14b90 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
14ba0 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
14bb0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
14bc0 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
14bd0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
14be0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
14bf0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
14c00 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
14c10 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
14c20 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
14c30 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
14c40 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
14c50 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  NDEBUG.    else{
14c60 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
14c70 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E3("NOSTORE %d p
14c80 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
14c90 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
14ca0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  t->pgno);.    }.
14cb0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
14cc0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14cd0 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20     pList->dirty 
14ce0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
14cf0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
14d00 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
14d10 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
14d20 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
14d30 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
14d40 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
14d50 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14d60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
14d70 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
14d80 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
14d90 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
14da0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
14db0 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
14dc0 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
14dd0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
14de0 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
14df0 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
14e00 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
14e10 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
14e20 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
14e30 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
14e40 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
14e50 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  r->pDirty;.}../*
14e60 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
14e70 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
14e80 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
14e90 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
14ea0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
14eb0 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
14ec0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
14ed0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
14ee0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
14ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14f00 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
14f10 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
14f20 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
14f30 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
14f40 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
14f50 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
14f60 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
14f70 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
14f80 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
14f90 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
14fa0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
14fb0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
14fc0 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
14fd0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
14fe0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
14ff0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
15000 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
15010 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  rnal) ){.    ret
15020 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
15030 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
15040 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
15050 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  er->fd) ){.    r
15060 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
15070 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
15080 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
15090 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
150a0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
150b0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
150c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
150d0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
150e0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
150f0 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61  Try to find a pa
15100 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
15110 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79  that can be recy
15120 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69  cled. .**.** Thi
15130 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  s routine may re
15140 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15150 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f  R, SQLITE_FULL o
15160 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20  r SQLITE_OK. It 
15170 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74  .** does not set
15180 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
15190 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a  Code variable..*
151a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
151b0 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72  er_recycle(Pager
151c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79   *pPager, int sy
151d0 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70  ncOk, PgHdr **pp
151e0 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  Pg){.  PgHdr *pP
151f0 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a  g;.  *ppPg = 0;.
15200 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42  .  assert(!MEMDB
15210 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20  );..  /* Find a 
15220 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
15230 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
15240 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
15250 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72   not.  ** requir
15260 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
15270 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
15280 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  rnal..  */.  pPg
15290 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
152a0 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49  tSynced;..  /* I
152b0 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66  f we could not f
152c0 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20  ind a page that 
152d0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
152e0 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a   an fsync().  **
152f0 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
15300 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20  file then fsync 
15310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15320 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a  .  This is a.  *
15330 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72  * very slow oper
15340 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72  ation, so we wor
15350 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20  k hard to avoid 
15360 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d  it.  But sometim
15370 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74  es.  ** it can't
15380 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f   be helped..  */
15390 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26  .  if( pPg==0 &&
153a0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
153b0 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45  && syncOk && !ME
153c0 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  MDB){.    int rc
153d0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
153e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
153f0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rc!=0 ){.      r
15400 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
15410 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
15420 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
15430 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
15440 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
15450 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
15460 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  eader into the. 
15470 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
15480 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
15490 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72  ne to avoid ever
154a0 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75   modifying a jou
154b0 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65  rnal.      ** he
154c0 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
154d0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
154e0 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
154f0 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a  hat have.      *
15500 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  * already been w
15510 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
15520 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20  tabase (in case 
15530 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20  the header is.  
15540 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77      ** trashed w
15550 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
15560 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
15570 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
15580 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
15590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
155a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
155b0 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61  f > 0 );.      a
155c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
155d0 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
155e0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
155f0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
15600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15610 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
15620 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
15630 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
15640 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
15650 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
15660 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
15670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15680 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
15690 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
156a0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
156b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
156c0 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
156d0 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
156e0 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
156f0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
15700 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
15710 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
15720 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
15730 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
15740 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
15750 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
15760 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
15770 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
15780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15790 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
157a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
157b0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
157c0 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  irty==0 );..  /*
157d0 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20   If the page we 
157e0 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73  are recycling is
157f0 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
15800 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a  sRollback, then.
15810 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f    ** set the glo
15820 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  bal alwaysRollba
15830 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69  ck flag, thus di
15840 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a  sabling the.  **
15850 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
15860 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69  tRollback() opti
15870 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  mization for the
15880 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72   rest of this tr
15890 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
158a0 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  It is necessary 
158b0 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75  to do this becau
158c0 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b  se the page mark
158d0 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
158e0 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  k.  ** might be 
158f0 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
15900 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
15910 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
15920 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a  n't remember.  *
15930 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61  * that is was ma
15940 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
15950 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  ack.  This means
15960 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
15970 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72  must.  ** be mar
15980 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
15990 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20  lback from here 
159a0 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  on out..  */.  i
159b0 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
159c0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f  llback ){.    IO
159d0 54 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52  TRACE(("ALWAYS_R
159e0 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70  OLLBACK %p\n", p
159f0 50 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67  Pager)).    pPag
15a00 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
15a10 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ck = 1;.  }..  /
15a20 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64  * Unlink the old
15a30 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
15a40 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ree list and the
15a50 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f   hash table.  */
15a60 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50  .  unlinkPage(pP
15a70 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g);.  assert( pP
15a80 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20  g->pgno==0 );.. 
15a90 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20   *ppPg = pPg;.  
15aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15ac0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15ad0 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72  ed to free super
15ae0 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c  fluous dynamical
15af0 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  ly allocated mem
15b00 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74  ory.** held by t
15b10 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e  he pager system.
15b20 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62   Memory in use b
15b30 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67  y any SQLite pag
15b40 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  er allocated.** 
15b50 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
15b60 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c  hread may be sql
15b70 69 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a  iteFree()ed..**.
15b80 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e  ** nReq is the n
15b90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
15ba0 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  f memory require
15bb0 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63  d. Once this muc
15bc0 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65  h has.** been re
15bd0 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63  leased, the func
15be0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20  tion returns. A 
15bf0 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66  negative value f
15c00 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a  or nReq means.**
15c10 20 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   free as much me
15c20 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
15c30 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
15c40 75 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  ue is the total 
15c50 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79  number .** of by
15c60 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
15c70 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 20 64  leased..*/.#if d
15c80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
15c90 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
15ca0 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69  GEMENT) && !defi
15cb0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15cc0 44 49 53 4b 49 4f 29 0a 69 6e 74 20 73 71 6c 69  DISKIO).int sqli
15cd0 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d  te3PagerReleaseM
15ce0 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b  emory(int nReq){
15cf0 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  .  const ThreadD
15d00 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71  ata *pTsdro = sq
15d10 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
15d20 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74  eadOnly();.  int
15d30 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a   nReleased = 0;.
15d40 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
15d50 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c  f the the global
15d60 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
15d70 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
15d80 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f  becomes a.  ** o
15d90 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20  -op; zero bytes 
15da0 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72  of memory are fr
15db0 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65  eed.  This is be
15dc0 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20  cause.  ** some 
15dd0 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f  of the code invo
15de0 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ked by this func
15df0 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20  tion may also.  
15e00 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** try to obtain
15e10 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75   the mutex, resu
15e20 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c  lting in a deadl
15e30 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
15e40 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
15e50 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (0) ){.    retur
15e60 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  n 0;.  }..  /* O
15e70 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75  utermost loop ru
15e80 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74  ns for at most t
15e90 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46  wo iterations. F
15ea0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77  irst iteration w
15eb0 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69  e.  ** try to fi
15ec0 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63  nd memory that c
15ed0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  an be released w
15ee0 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66  ithout calling f
15ef0 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20  sync(). Second. 
15f00 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77   ** iteration (w
15f10 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69  hich only runs i
15f20 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c  f the first fail
15f30 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20  ed to free nReq 
15f40 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65  bytes of.  ** me
15f50 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74  mory) is permitt
15f60 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63  ed to call fsync
15f70 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63  (). This is of c
15f80 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20  ourse much more 
15f90 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e  .  ** expensive.
15fa0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
15fb0 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20   i<=1; i++){..  
15fc0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
15fd0 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65  h all the SQLite
15fe0 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62   pagers opened b
15ff0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
16000 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67  read. */.    Pag
16010 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 54 73  er *pPager = pTs
16020 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  dro->pPager;.   
16030 20 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26   for( ; pPager &
16040 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65  & (nReq<0 || nRe
16050 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50  leased<nReq); pP
16060 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65  ager=pPager->pNe
16070 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  xt){.      PgHdr
16080 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74   *pPg;.      int
16090 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   rc;..      if( 
160a0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
160b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
160c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   }..      /* For
160d0 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79   each pager, try
160e0 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79   to free as many
160f0 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62   pages as possib
16100 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20  le (without .   
16110 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73     ** calling fs
16120 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73  ync() if this is
16130 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
16140 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65  tion of the oute
16150 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rmost .      ** 
16160 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loop)..      */.
16170 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
16180 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61  ITE_OK==(rc = pa
16190 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
161a0 65 72 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26  er, i, &pPg)) &&
161b0 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20   pPg) {.        
161c0 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61  /* We've found a
161d0 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41   page to free. A
161e0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
161f0 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a   page has been .
16200 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76          ** remov
16210 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
16220 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65   hash-table, fre
16230 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65  e-list and synce
16240 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20  d-list .        
16250 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64  ** (pFirstSynced
16260 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69  ). It is still i
16270 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20  n the all pages 
16280 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20  (pAll) list. .  
16290 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20        ** Remove 
162a0 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73  it from this lis
162b0 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  t before freeing
162c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
162d0 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68       ** Todo: Ch
162e0 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53  eck the Pager.pS
162f0 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65  tmt list to make
16300 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b   sure this is Ok
16310 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  . It .        **
16320 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f   probably is tho
16330 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ugh..        */.
16340 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
16350 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tmp;.        ass
16360 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ert( pPg );.    
16370 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61      if( pPg==pPa
16380 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ger->pAll ){.   
16390 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
163a0 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
163b0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  tAll;.        }e
163c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
163d0 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d  or( pTmp=pPager-
163e0 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65  >pAll; pTmp->pNe
163f0 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70  xtAll!=pPg; pTmp
16400 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20  =pTmp->pNextAll 
16410 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54  ){}.          pT
16420 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  mp->pNextAll = p
16430 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
16440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16450 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c  nReleased += sql
16460 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67  iteAllocSize(pPg
16470 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
16480 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
16490 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
164a0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
164b0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
164c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
164d0 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
164e0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
164f0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  g);.      }..   
16500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16520 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  /* An error occu
16530 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
16540 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
16550 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20  se file or .    
16560 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
16570 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  n pager_recycle(
16580 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20  ). The error is 
16590 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20  not returned to 
165a0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
165b0 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66  caller of this f
165c0 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  unction. Instead
165d0 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
165e0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
165f0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  ..        ** The
16600 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72   error will be r
16610 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
16620 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69  ser (or users, i
16630 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20  n the case .    
16640 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
16650 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
16660 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
16670 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
16680 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
16690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
166a0 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d  ert( (rc&0xff)==
166b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20  SQLITE_IOERR || 
166c0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
166d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
166e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
166f0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
16700 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65   );.        page
16710 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16720 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
16730 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
16740 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65   nReleased;.}.#e
16750 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
16760 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
16770 41 47 45 4d 45 4e 54 20 26 26 20 21 53 51 4c 49  AGEMENT && !SQLI
16780 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
16790 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  /../*.** Read th
167a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
167b0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
167c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
167d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
167e0 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a  adDbPage(Pager *
167f0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
16800 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
16810 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
16820 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
16830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16840 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
16850 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
16860 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16870 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
16880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
16890 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
168a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
168b0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
168e0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
168f0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
16900 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
16910 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
16920 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
16930 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
16940 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
16950 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
16960 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  );.  PAGERTRACE3
16970 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
16980 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16990 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
169a0 6f 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  o);.  if( pgno==
169b0 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
169c0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
169d0 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44  ers, &((u8*)PGHD
169e0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b  R_TO_DATA(pPg))[
169f0 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
16a30 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
16a40 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
16a50 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
16a60 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
16a70 6e 6f 2c 20 33 29 3b 0a 20 20 72 65 74 75 72 6e  no, 3);.  return
16a80 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
16a90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16aa0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
16ab0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16ac0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
16ad0 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
16ae0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
16af0 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
16b00 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
16b10 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
16b20 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
16b30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
16b40 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
16b50 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
16b60 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
16b70 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
16b80 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
16b90 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
16ba0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
16bb0 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
16bc0 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
16bd0 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
16be0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
16bf0 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
16c00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
16c10 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
16c20 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
16c30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
16c40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
16c50 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
16c60 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  K ){.    if( !ME
16c70 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73  MDB ){.      ass
16c80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
16c90 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
16ca0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
16cb0 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  dlock ){.       
16cc0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
16cd0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
16ce0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
16cf0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16d10 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
16d20 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
16d30 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
16d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16d50 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
16d60 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16d70 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
16d80 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
16d90 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
16da0 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
16db0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
16dc0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
16dd0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
16de0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
16df0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
16e00 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
16e10 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68    */.      if( h
16e20 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
16e30 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
16e40 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
16e50 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
16e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
16e70 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
16e80 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
16e90 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
16ea0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
16eb0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
16ec0 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
16ed0 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
16ee0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
16ef0 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
16f00 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
16f10 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
16f30 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
16f40 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
16f50 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
16f60 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
16f70 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
16f80 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
16f90 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
16fa0 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
16fb0 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
16fc0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
16fd0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
16fe0 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
16ff0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
17000 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
17010 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
17020 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
17030 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
17040 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
17050 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
17060 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20   ** obtain it's 
17070 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
17080 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
17090 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
170a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
170b0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
170c0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
170d0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
170e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
170f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17100 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
17110 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17120 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
17130 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
17140 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17150 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
17160 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
17170 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20  SIVE;. .        
17180 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
17190 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
171a0 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
171b0 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
171c0 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
171d0 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
171e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
171f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
17200 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
17210 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
17220 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
17230 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
17240 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
17250 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
17260 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
17270 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
17280 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
17290 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
172a0 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
172b0 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
172c0 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
172d0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
172e0 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
172f0 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
17300 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
17310 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68    **..** Open th
17320 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
17330 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
17340 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
17350 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69   in ..** exclusi
17360 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
17370 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17380 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
17390 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
173a0 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
173b0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
173c0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
173d0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
173e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
173f0 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
17400 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
17410 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
17420 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
17430 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
17440 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
17450 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17460 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17470 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
17480 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
17490 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
174a0 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
174b0 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20       int ro;.   
174c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
174d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
174e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
174f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
17500 52 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72  ReadWrite(pPager
17510 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
17520 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a  ger->jfd, &ro);.
17530 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17550 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29  || pPager->jfd )
17560 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17570 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
17580 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17590 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  SY;.            
175a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
175b0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
175c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
175d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
175e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
175f0 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
17600 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
17610 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17620 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
17630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17640 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17650 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
17660 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17670 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
17680 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
17690 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
176a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
176b0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
176c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
176d0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
176e0 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
176f0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
17700 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
17710 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
17720 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
17730 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
17740 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
17750 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17760 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
17770 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
17780 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
17790 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
177a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
177b0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
177c0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
177d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
177e0 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
177f0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
17800 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
17810 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
17820 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
17830 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
17840 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
17850 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17860 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
17870 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
17880 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
17890 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
178a0 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
178b0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
178c0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
178d0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
178e0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
178f0 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
17900 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
17910 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
17920 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
17930 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
17940 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
17950 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
17960 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
17970 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
17980 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
17990 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
179a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
179b0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
179c0 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
179d0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
179e0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
179f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  .        ** at o
17a00 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
17a10 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
17a20 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
17a30 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
17a40 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
17a50 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
17a60 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
17a70 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
17a80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  e.        ** oth
17a90 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
17aa0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
17ab0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
17ac0 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
17ad0 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
17ae0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
17af0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
17b00 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
17b10 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
17b20 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
17b30 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20  not be .        
17b40 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
17b50 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
17b60 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
17b70 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
17b80 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  t.        ** it 
17b90 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
17ba0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
17bb0 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
17bc0 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
17bd0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
17be0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17bf0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17c00 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
17c10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17c20 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
17c30 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
17c40 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
17c50 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
17c60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17c70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
17c80 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
17c90 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
17ca0 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
17cb0 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
17cc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17cd0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
17ce0 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 24);.         
17cf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17d00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17d40 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
17d50 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
17d60 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
17d70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
17d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
17da0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
17dc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
17dd0 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
17de0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
17df0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
17e00 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
17e10 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
17e20 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
17e30 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
17e40 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
17e50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
17e60 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
17e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17e80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
17e90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
17ea0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
17eb0 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
17ec0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
17ed0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
17ee0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
17ef0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17f00 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
17f10 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
17f20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
17f30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
17f40 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74  e a PgHdr object
17f50 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74  .   Either creat
17f60 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72  e a new one or r
17f70 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74  euse.** an exist
17f80 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ing one that is 
17f90 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e  not otherwise in
17fa0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65   use..**.** A ne
17fb0 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  w PgHdr structur
17fc0 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20  e is created if 
17fd0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
17fe0 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65  wing are.** true
17ff0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
18000 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63   We have not exc
18010 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75  eeded our maximu
18020 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68  m allocated cach
18030 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
18040 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65     as set by the
18050 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
18060 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  ize" command..**
18070 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
18080 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64  re are no unused
18090 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61   PgHdr objects a
180a0 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73  vailable at this
180b0 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   time..**.**    
180c0 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e   (3)  This is an
180d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
180e0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ase..**.**     (
180f0 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  4)  There are no
18100 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74   PgHdr objects t
18110 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  hat do not requi
18120 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  re a journal.** 
18130 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79           file sy
18140 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66  nc and a sync of
18150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18160 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  e is currently.*
18170 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69  *          prohi
18180 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bited..**.** Oth
18190 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e  erwise, reuse an
181a0 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e   existing PgHdr.
181b0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
181c0 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78  , reuse an.** ex
181d0 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20  isting PgHdr if 
181e0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
181f0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
18200 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
18210 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72   have reached or
18220 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61   exceeded the ma
18230 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65  ximum cache size
18240 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
18250 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20  owed by "PRAGMA 
18260 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a  cache_size"..**.
18270 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
18280 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61  e is a PgHdr ava
18290 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64  ilable with PgHd
182a0 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a  r->nRef==0.**.**
182b0 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65       (3)  We are
182c0 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65   not in an in-me
182d0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  mory database.**
182e0 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74  .**     (4)  Eit
182f0 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20  her there is an 
18300 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20  available PgHdr 
18310 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
18320 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  ed.**          t
18330 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64  o be synced to d
18340 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b  isk or else disk
18350 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72   syncing is curr
18360 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
18370 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74    allowed..*/.st
18380 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c  atic int pagerAl
18390 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72  locatePage(Pager
183a0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
183b0 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  **ppPg){.  int r
183c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
183d0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
183e0 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
183f0 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20  PgHdr if any of 
18400 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69  the four conditi
18410 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a  ons defined .  *
18420 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20  * above is met: 
18430 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
18440 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
18450 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67  xPage.   || pPag
18460 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20  er->pFirst==0 . 
18470 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c    || MEMDB.   ||
18480 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74   (pPager->pFirst
18490 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61  Synced==0 && pPa
184a0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a  ger->doNotSync).
184b0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61    ){.    if( pPa
184c0 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
184d0 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
184e0 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
184f0 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
18500 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
18510 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
18520 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
18530 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
18540 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
18550 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
18560 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
18570 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
18580 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
18590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
185a0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
185b0 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
185c0 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
185d0 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
185e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185f0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
18600 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
18610 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
18640 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
18650 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
18660 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18670 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18680 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
18690 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
186a0 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
186b0 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
186c0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
186d0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
186e0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
186f0 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
18700 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
18710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
18720 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
18730 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
18740 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
18750 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
18760 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
18770 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
18780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
18790 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
187a0 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
187b0 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
187c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
187d0 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
187e0 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, 1, &pPg);.   
187f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18800 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63  BUSY ){.      rc
18810 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
18820 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  BLOCKED;.    }. 
18830 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18850 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
18860 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
18870 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18880 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
18890 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
188a0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
188b0 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
188c0 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
188d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
188e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
188f0 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
18900 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
18910 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
18920 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
18930 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
18940 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
18950 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
18960 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
18970 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
18980 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
18990 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
189a0 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
189b0 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
189c0 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
189d0 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
189e0 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
189f0 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
18a00 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
18a10 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
18a20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
18a30 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
18a40 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
18a50 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
18a60 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
18a70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
18a80 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
18a90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18aa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
18ab0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
18ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18ad0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
18af0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18b00 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
18b10 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
18b20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
18b30 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
18b40 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
18b50 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
18b60 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
18b70 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
18b80 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
18b90 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
18ba0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18bb0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
18bc0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
18bd0 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
18be0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
18bf0 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
18c00 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
18c10 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
18c20 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
18c30 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
18c40 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
18c50 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
18c60 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
18c70 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
18c80 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
18c90 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
18ca0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
18cb0 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
18cc0 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
18cd0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
18ce0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
18cf0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
18d00 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
18d10 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
18d20 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
18d30 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
18d40 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
18d50 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
18d60 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
18d70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
18d80 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
18d90 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
18da0 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
18db0 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
18dc0 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
18dd0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
18de0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
18df0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
18e00 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
18e10 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
18e20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
18e30 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
18e40 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
18e50 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
18e60 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
18e70 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
18e80 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
18e90 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
18ea0 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
18eb0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
18ec0 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
18ed0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
18ee0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
18ef0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
18f00 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
18f10 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
18f20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
18f30 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
18f40 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
18f50 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
18f60 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
18f70 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
18f80 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
18f90 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
18fa0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
18fb0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
18fc0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
18fd0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
18fe0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
18ff0 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
19000 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
19010 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
19020 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
19030 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
19040 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
19050 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
19060 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
19070 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
19080 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
19090 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
190a0 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
190b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
190c0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
190d0 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
190e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
190f0 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
19100 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
19110 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
19120 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
19130 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
19140 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
19150 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
19160 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
19170 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
19180 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
19190 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
191a0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
191b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
191c0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
191d0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
191e0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
191f0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
19200 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
19210 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
19220 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
19230 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
19240 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
19250 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
19260 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
19270 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
19280 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
19290 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
192a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
192b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
192c0 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
192d0 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
192e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
192f0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
19300 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
19310 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
19320 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
19330 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
19340 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
19350 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
19360 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
19370 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
19380 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
19390 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
193a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
193b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
193c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
193d0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
193e0 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
193f0 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
19400 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
19410 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
19420 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
19430 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
19440 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
19450 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
19460 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
19470 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
19480 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
19490 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
194a0 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
194b0 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
194c0 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
194d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
194e0 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
194f0 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
19500 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
19510 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
19520 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
19530 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
19540 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
19550 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
19570 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
19580 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
19590 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
195a0 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  K );..  pPg = pa
195b0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
195c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
195d0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
195e0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
195f0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
19600 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
19610 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20  .    int nMax;. 
19620 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41     int h;.    PA
19630 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
19640 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20  >nMiss);.    rc 
19650 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50  = pagerAllocateP
19660 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  age(pPager, &pPg
19670 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
196a0 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e   }..    pPg->pgn
196b0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73  o = pgno;.    as
196c0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20  sert( !MEMDB || 
196d0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d  pgno>pPager->stm
196e0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  tSize );.    if(
196f0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19700 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
19710 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
19720 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
19730 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79  lite3CheckMemory
19740 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
19750 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
19760 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19770 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
19780 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
19790 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
197a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
197b0 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
197c0 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
197d0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
197e0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
197f0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
19800 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
19810 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
19820 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b  ;.    }..    mak
19830 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
19840 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
19850 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
19860 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
19870 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
19880 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
19890 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
198a0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
198b0 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
198c0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
198d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
198e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
198f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
19900 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19910 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
19920 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
19930 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
19940 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
19950 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75  Code;.      retu
19960 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
19970 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
19980 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
19990 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
199a0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
199b0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
199c0 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
199d0 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
199e0 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
199f0 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
19a00 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
19a10 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
19a20 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
19a30 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
19a40 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
19a50 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
19a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
19a70 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
19a80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
19a90 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
19aa0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
19ab0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
19ac0 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
19ad0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
19ae0 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
19af0 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
19b00 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
19b10 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
19b20 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
19b30 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
19b40 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
19b50 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
19b60 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
19b70 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
19b80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19b90 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
19ba0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
19bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
19bc0 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
19bd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
19be0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
19bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19c00 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
19c10 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
19c20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
19c30 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
19c40 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
19c50 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
19c60 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
19c70 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
19c80 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
19c90 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
19ca0 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
19cb0 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
19cc0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
19cd0 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
19ce0 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
19cf0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
19d00 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
19d10 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
19d20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
19d30 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
19d40 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
19d50 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
19d60 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
19d70 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
19d80 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
19d90 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
19da0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
19db0 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
19dc0 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
19dd0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
19de0 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
19df0 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
19e00 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
19e10 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
19e20 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
19e30 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
19e40 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
19e50 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
19e60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19e70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19e80 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
19e90 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
19ea0 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
19eb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19ec0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
19ed0 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
19ee0 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
19ef0 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
19f00 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
19f10 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
19f20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
19f30 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
19f40 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
19f50 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
19f60 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
19f70 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
19f80 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
19f90 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
19fa0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
19fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
19fc0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
19fd0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
19fe0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
19ff0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
1a000 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1a010 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
1a020 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1a030 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
1a040 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1a050 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
1a060 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
1a070 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
1a080 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
1a090 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
1a0a0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
1a0b0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1a0c0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1a0d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1a0e0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
1a0f0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
1a100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1a110 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1a120 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1a130 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c   !pPager->pAll |
1a140 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  | pPager->exclus
1a150 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72  iveMode );.    r
1a160 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1a170 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1a180 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
1a190 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
1a1a0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
1a1b0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
1a1c0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1a1d0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1a1e0 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
1a1f0 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
1a200 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
1a210 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1a220 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1a230 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1a240 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1a250 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1a260 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1a270 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1a280 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1a290 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1a2a0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1a2b0 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1a2c0 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1a2d0 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1a2e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1a2f0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1a300 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1a310 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1a320 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f  Page *pPg){..  /
1a330 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1a340 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1a350 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
1a360 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
1a370 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
1a380 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
1a390 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48  INFO(pPg);..  CH
1a3a0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
1a3b0 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
1a3c0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
1a3d0 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
1a3e0 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
1a3f0 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
1a400 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
1a410 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1a420 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1a430 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1a440 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
1a450 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
1a460 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
1a470 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
1a480 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
1a490 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
1a4a0 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
1a4b0 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
1a4c0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
1a4d0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
1a4e0 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
1a4f0 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
1a500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a510 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
1a520 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1a530 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
1a540 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
1a550 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1a560 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1a570 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
1a580 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
1a590 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
1a5a0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
1a5b0 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1a5c0 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
1a5d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1a5e0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
1a5f0 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
1a600 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
1a610 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
1a620 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
1a630 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1a640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
1a650 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
1a660 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a670 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
1a680 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
1a690 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e  =0 && (!pPager->
1a6a0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1a6b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a6c0 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  Off>0) ){.      
1a6d0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
1a6e0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1a6f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a710 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1a720 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a730 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
1a740 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
1a750 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
1a760 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
1a770 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a780 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
1a790 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a7a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
1a7b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1a7c0 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
1a7d0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1a7e0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
1a7f0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
1a800 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1a810 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1a820 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
1a830 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1a840 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1a850 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
1a860 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1a870 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1a880 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1a890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a8a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1a8b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a8c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1a8d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a8e0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a8f0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1a900 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1a910 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
1a920 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1a930 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1a940 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1a950 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1a960 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1a970 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a980 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
1a990 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1a9a0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1a9b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a9c0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
1a9d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1a9e0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  &pPager->jfd,.  
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1aa10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
1aa20 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
1aa30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1aa40 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50  ger->jfd );.  pP
1aa50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1aa60 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1aa70 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1aa80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1aa90 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
1aaa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1aab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aac0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
1aad0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1aae0 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
1aaf0 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  al);.    }.    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 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
1ab30 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
1ab40 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
1ab50 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
1ab60 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
1ab70 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1ab80 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
1ab90 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
1aba0 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
1abb0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
1abc0 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
1abd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1abe0 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
1abf0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1ac00 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1ac10 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
1ac20 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1ac30 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
1ac40 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1ac50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1ac60 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
1ac70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ac80 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
1ac90 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1aca0 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
1acb0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1acc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
1acd0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1ace0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
1acf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ad00 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
1ad10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ad20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ad30 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
1ad40 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1ad50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1ad60 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
1ad70 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
1ad80 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1ad90 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
1ada0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1adb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1adc0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
1add0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ade0 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
1adf0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
1ae00 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1ae10 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
1ae20 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1ae30 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
1ae40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ae50 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
1ae60 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1ae70 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
1ae80 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
1ae90 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
1aea0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
1aeb0 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
1aec0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1aed0 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
1aee0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1aef0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1af00 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
1af10 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1af20 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
1af30 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1af40 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1af50 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
1af60 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
1af70 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
1af80 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
1af90 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
1afa0 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
1afb0 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
1afc0 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
1afd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
1afe0 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
1aff0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
1b000 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
1b010 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
1b020 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1b030 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1b040 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
1b050 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
1b060 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1b070 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b080 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
1b090 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1b0a0 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
1b0b0 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
1b0c0 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
1b0d0 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
1b0e0 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
1b0f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1b100 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
1b110 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1b120 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
1b130 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
1b140 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
1b150 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
1b160 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
1b170 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
1b180 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
1b190 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
1b1a0 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
1b1b0 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
1b1c0 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
1b1d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1b1e0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1b1f0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
1b200 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
1b210 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
1b220 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1b230 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
1b240 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
1b250 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
1b260 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1b270 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
1b280 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
1b290 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
1b2a0 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
1b2b0 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
1b2c0 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
1b2d0 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
1b2e0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
1b2f0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1b300 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
1b310 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
1b320 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
1b330 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1b340 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1b350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b360 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1b370 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
1b380 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1b390 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1b3a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1b3b0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1b3c0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
1b3d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1b3e0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
1b3f0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1b400 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1b410 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1b420 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1b430 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
1b440 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1b450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1b460 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1b470 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
1b480 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
1b490 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b4a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b4b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1b4c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
1b4d0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
1b4e0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
1b4f0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1b500 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1b510 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1b520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b530 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
1b540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b550 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b570 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1b580 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
1b590 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
1b5a0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
1b5b0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b5c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1b5d0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1b5e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1b5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b600 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1b610 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1b620 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1b630 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1b640 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1b650 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b660 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1b670 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1b680 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1b690 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1b6a0 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
1b6b0 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
1b6c0 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
1b6d0 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
1b6e0 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
1b6f0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1b700 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
1b710 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
1b720 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b730 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
1b740 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
1b750 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1b760 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
1b770 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1b780 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1b790 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1b7a0 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1b7b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b7c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1b7d0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1b7e0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1b7f0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1b800 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1b810 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1b820 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1b830 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1 );.    if( !p
1b840 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b850 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1b860 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b880 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b890 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1b8a0 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ze;.      rc = w
1b8b0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1b8c0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1b8d0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  }.  assert( !pPa
1b8e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b8f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1b900 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d  nalOff>0 || rc!=
1b910 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
1b920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b930 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
1b940 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
1b950 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
1b960 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
1b970 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
1b980 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1b990 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
1b9a0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1b9b0 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
1b9c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1b9d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1b9e0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
1b9f0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
1ba00 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
1ba10 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
1ba20 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
1ba30 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1ba40 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
1ba50 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1ba60 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
1ba70 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1ba80 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
1ba90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1baa0 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
1bab0 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
1bac0 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
1bad0 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
1bae0 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
1baf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1bb00 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
1bb10 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1bb20 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
1bb30 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1bb40 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
1bb50 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1bb60 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
1bb70 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
1bb80 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
1bb90 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
1bba0 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1bbb0 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69  >pPrevDirty->pDi
1bbc0 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1bbd0 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1bbe0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
1bbf0 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1bc00 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
1bc10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  .}.../*.** Mark 
1bc20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
1bc30 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
1bc40 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1bc50 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1bc60 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
1bc70 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
1bc80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
1bc90 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
1bca0 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
1bcb0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
1bcc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1bcd0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1bce0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
1bcf0 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
1bd00 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
1bd10 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
1bd20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
1bd30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1bd40 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
1bd50 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
1bd60 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
1bd70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1bd80 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
1bd90 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1bda0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
1bdb0 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
1bdc0 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
1bdd0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
1bde0 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
1bdf0 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
1be00 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1be10 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1be20 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1be30 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
1be40 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
1be50 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
1be60 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
1be70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1be80 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
1be90 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
1bea0 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
1beb0 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
1bec0 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
1bed0 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
1bee0 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
1bef0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
1bf00 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
1bf10 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
1bf20 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1bf30 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
1bf40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1bf50 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
1bf60 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
1bf70 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
1bf80 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61  _DATA(pPg);.  Pa
1bf90 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1bfa0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1bfb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bfc0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1bfd0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
1bfe0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1bff0 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
1c000 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1c010 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1c020 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
1c030 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c040 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
1c050 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1c060 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
1c070 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1c080 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1c090 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
1c0a0 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1c0b0 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1c0c0 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
1c0d0 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
1c0e0 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
1c0f0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1c100 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
1c110 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
1c120 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
1c130 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
1c140 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1c150 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
1c160 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
1c170 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
1c180 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
1c190 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
1c1a0 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
1c1b0 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
1c1c0 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
1c1d0 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
1c1e0 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
1c1f0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1c200 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
1c210 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
1c220 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
1c230 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1c240 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
1c250 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1c260 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c270 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1c280 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
1c290 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
1c2a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1c2b0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1c2c0 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
1c2d0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
1c2e0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
1c2f0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
1c300 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
1c310 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74  nal && (pageInSt
1c320 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20  atement(pPg) || 
1c330 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c340 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
1c350 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1c360 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1c370 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1c380 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1c390 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1c3a0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1c3b0 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1c3c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1c3d0 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1c3e0 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1c3f0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1c400 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1c410 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1c420 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1c430 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1c440 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1c450 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1c460 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1c470 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1c480 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1c490 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1c4a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c4b0 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1c4c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c4e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c4f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c500 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c510 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1c520 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1c530 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1c540 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1c550 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1c560 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1c570 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1c580 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c590 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1c5a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c5b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c5c0 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1c5d0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1c5e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1c5f0 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
1c600 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1c610 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1c620 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1c630 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1c640 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1c650 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1c660 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1c670 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1c680 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1c690 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1c6a0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1c6b0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1c6c0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1c6d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
1c6e0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1c6f0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1c700 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
1c710 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
1c720 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1c730 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1c740 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
1c750 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Pg;.        if( 
1c760 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1c770 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1c780 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1c790 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1c7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1c7b0 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
1c7c0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1c7d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c7e0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c7f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c800 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
1c810 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1c820 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
1c830 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
1c840 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1c850 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
1c860 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1c870 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1c880 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
1c890 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1c8a0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1c8b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1c8c0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1c8d0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
1c8e0 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
1c8f0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1c900 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  ta2, *pEnd;.    
1c910 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1c920 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1c930 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1c940 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1c950 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1c960 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1c970 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1c980 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1c990 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1c9a0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
1c9b0 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
1c9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1c9d0 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1c9e0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1c9f0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
1ca00 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1ca10 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1ca20 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1ca30 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1ca40 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1ca50 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1ca60 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
1ca70 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
1ca80 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
1ca90 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
1caa0 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
1cab0 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
1cac0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1cad0 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
1cae0 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
1caf0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cb00 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
1cb10 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
1cb20 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1cb30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1cb40 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1cb50 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1cb60 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
1cb70 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1cb80 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1cb90 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1cba0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
1cbb0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1cbc0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67  journalOff, szPg
1cbd0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  ));.          PA
1cbe0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1cbf0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1cc00 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
1cc10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cc20 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1cc30 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1cc40 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
1cc50 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1cc60 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1cc70 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1cc80 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1cc90 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1cca0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  c);.          *(
1ccb0 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
1ccc0 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72  d;...  /* An err
1ccd0 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
1cce0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
1ccf0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
1cd00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
1cd10 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
1cd20 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
1cd30 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
1cd40 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1cd50 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1cd60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cd70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1cd80 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
1cd90 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
1cda0 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1cdb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1cdc0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1cdd0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1cde0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1cdf0 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
1ce00 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1ce10 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1ce20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1ce30 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1ce40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1ce50 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ce60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ce70 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1ce80 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1ce90 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1cea0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ceb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1cec0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67  lse{.        pPg
1ced0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
1cee0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1cef0 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
1cf00 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
1cf10 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50   PAGERTRACE4("AP
1cf20 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
1cf30 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1cf60 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1cf70 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
1cf80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
1cf90 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
1cfa0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1cfb0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1cfc0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
1cfd0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1cfe0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
1cff0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
1d000 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
1d010 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
1d020 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
1d030 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
1d040 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1d050 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1d060 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
1d070 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
1d080 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1d090 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
1d0a0 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
1d0b0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
1d0c0 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
1d0d0 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
1d0e0 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
1d0f0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
1d100 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1d110 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20  tInUse .     && 
1d120 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
1d130 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28  (pPg) .     && (
1d140 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
1d150 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1d160 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
1d170 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1d180 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1d190 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1d1a0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1d1b0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1d1c0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1d1d0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1d1e0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1d1f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
1d200 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
1d210 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
1d220 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1d230 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1d240 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
1d250 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
1d260 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
1d270 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1d280 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
1d290 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1d2a0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1d2b0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1d2c0 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
1d2d0 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1d2e0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1d2f0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1d300 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1d310 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
1d320 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1d330 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
1d340 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1d350 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1d360 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1d370 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20  g->pgno, 7)-4;. 
1d380 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1d390 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1d3a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
1d3b0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1d3c0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1d3d0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1d3e0 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
1d3f0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1d400 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1d410 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1d420 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1d430 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1d440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d460 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d470 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1d480 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
1d490 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1d4a0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1d4b0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1d4c0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1d4d0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1d4e0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1d4f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d500 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
1d510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1d520 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
1d530 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1d540 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1d550 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
1d560 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1d570 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
1d580 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1d590 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
1d5a0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
1d5b0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
1d5c0 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
1d5d0 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
1d5e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
1d5f0 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
1d600 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d610 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d630 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
1d640 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
1d650 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
1d660 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
1d670 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
1d680 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
1d690 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1d6a0 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
1d6b0 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
1d6c0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
1d6d0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1d6e0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1d6f0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
1d700 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
1d710 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
1d720 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
1d730 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1d740 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
1d750 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
1d760 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
1d770 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
1d780 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
1d790 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
1d7a0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
1d7b0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1d7c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
1d7d0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1d7e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1d7f0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
1d800 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
1d810 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d820 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
1d830 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
1d840 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1d850 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
1d860 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
1d870 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
1d880 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
1d890 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21  eSize);..  if( !
1d8a0 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65  MEMDB && nPagePe
1d8b0 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
1d8c0 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
1d8d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1d8e0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1d8f0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1d900 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
1d910 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
1d920 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
1d930 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1d940 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1d950 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
1d960 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1d970 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d980 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
1d990 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
1d9a0 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
1d9b0 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  i;..    /* Set t
1d9c0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
1d9d0 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
1d9e0 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
1d9f0 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61  t allow a journa
1da00 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20  l.    ** header 
1da10 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
1da20 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
1da30 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69  journaled by thi
1da40 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
1da50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1da60 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1da70 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1da80 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
1da90 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
1daa0 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
1dab0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
1dac0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
1dad0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
1dae0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
1daf0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
1db00 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
1db10 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
1db20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
1db30 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1db40 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1db50 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
1db60 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
1db70 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
1db80 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
1db90 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
1dba0 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  unt = sqlite3Pag
1dbb0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1dbc0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  er);.    if( pPg
1dbd0 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
1dbe0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
1dbf0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
1dc00 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
1dc10 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
1dc20 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
1dc30 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1dc40 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f   nPage = nPageCo
1dc50 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d  unt+1-pg1;.    }
1dc60 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
1dc70 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74  e = nPagePerSect
1dc80 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
1dc90 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20  sert(nPage>0);. 
1dca0 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
1dcb0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
1dcc0 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
1dcd0 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
1dce0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1dcf0 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
1dd00 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
1dd10 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70       Pgno pg = p
1dd20 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69 66 28  g1+ii;.      if(
1dd30 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
1dd40 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d  rnal || pg==pPg-
1dd50 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20  >pgno || .      
1dd60 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f      pg>pPager->o
1dd70 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70  rigDbSize || !(p
1dd80 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1dd90 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26  l[pg/8]&(1<<(pg&
1dda0 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20  7))).      ) {. 
1ddb0 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
1ddc0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1ddd0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
1dde0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
1ddf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1de00 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1de10 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
1de20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1de30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1de40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1de50 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1de60 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1de70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1de80 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
1de90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dea0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1deb0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1dec0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1ded0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
1dee0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
1def0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1df00 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1df10 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
1df20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1df30 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1df40 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
1df50 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1df60 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
1df70 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
1df80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1df90 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
1dfa0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
1dfb0 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
1dfc0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
1dfd0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1dfe0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1dff0 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
1e000 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1e010 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
1e020 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
1e030 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
1e040 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e050 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65  _VACUUM./*.** Re
1e060 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
1e070 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
1e080 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
1e090 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
1e0a0 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
1e0b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e0c0 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50  PagerOverwrite(P
1e0d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1e0e0 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
1e0f0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
1e100 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
1e110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e120 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
1e130 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  gno, &pPg);.  if
1e140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e150 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1e160 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1e170 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
1e180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e190 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
1e1a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
1e1b0 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  g), pData, pPage
1e1c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1e1d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
1e1e0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1e1f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e200 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1e210 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1e220 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1e230 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
1e240 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1e250 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
1e260 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
1e270 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
1e280 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
1e290 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
1e2a0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
1e2b0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
1e2c0 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
1e2d0 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
1e2e0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1e2f0 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
1e300 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
1e310 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
1e320 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
1e330 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
1e340 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
1e350 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
1e360 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
1e370 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
1e380 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
1e390 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
1e3a0 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
1e3b0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
1e3c0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1e3d0 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
1e3e0 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
1e3f0 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
1e400 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
1e410 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
1e420 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
1e430 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
1e440 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
1e450 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
1e460 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
1e470 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
1e480 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
1e490 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
1e4a0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1e4b0 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
1e4c0 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
1e4d0 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
1e4e0 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
1e4f0 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
1e500 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
1e510 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
1e520 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
1e530 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
1e540 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
1e550 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
1e560 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
1e570 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
1e580 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
1e590 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
1e5a0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
1e5b0 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
1e5c0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1e5d0 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
1e5e0 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
1e5f0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
1e600 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e610 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
1e620 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c  used,.** the sql
1e630 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e640 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
1e650 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
1e660 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
1e670 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69  age contains cri
1e680 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
1e690 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
1e6a0 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20  sure it gets.** 
1e6b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
1e6c0 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69  pite of the sqli
1e6d0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1e6e0 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
1e6f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1e700 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67  rDontWrite(DbPag
1e710 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50  e *pDbPage){.  P
1e720 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1e730 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1e740 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e750 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  er;..  if( MEMDB
1e760 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 67   ) return;.  pPg
1e770 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1e780 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
1e790 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65  >dirty && !pPage
1e7a0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1e7b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e7c0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1e7d0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1e7e0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1e7f0 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1e800 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1e810 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1e820 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1e830 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1e840 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1e850 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1e860 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1e870 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1e880 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1e890 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1e8a0 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1e8b0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1e8c0 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1e8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e8e0 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1e8f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1e900 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1e910 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1e920 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1e930 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1e940 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1e950 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1e960 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1e970 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1e980 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1e990 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1e9a0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1e9b0 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1e9c0 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1e9d0 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1e9e0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1e9f0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1ea00 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1ea10 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1ea20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1ea30 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1ea40 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
1ea50 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1ea60 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
1ea70 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1ea80 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
1ea90 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1eaa0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1eab0 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
1eac0 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
1ead0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1eae0 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
1eaf0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1eb00 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1eb10 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
1eb20 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1eb30 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1eb40 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1eb50 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
1eb60 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
1eb70 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1eb80 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1eb90 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
1eba0 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
1ebb0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1ebc0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
1ebd0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
1ebe0 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
1ebf0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
1ec00 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
1ec10 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
1ec20 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
1ec30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
1ec40 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
1ec50 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
1ec60 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
1ec70 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1ec80 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
1ec90 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
1eca0 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
1ecb0 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
1ecc0 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
1ecd0 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
1ece0 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
1ecf0 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
1ed00 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
1ed10 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
1ed20 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
1ed30 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
1ed40 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1ed50 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72  pPager;..  asser
1ed60 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1ed70 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1ed80 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1ed90 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1eda0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1edb0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1edc0 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
1edd0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1ede0 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  | MEMDB ) return
1edf0 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  ;.  if( !pPg->in
1ee00 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1ee10 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1ee20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1ee30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ee40 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ee50 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l!=0 );.    pPag
1ee60 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1ee70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1ee80 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1ee90 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
1eea0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  nal = 1;.    pPg
1eeb0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1eec0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1eed0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1eee0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1eef0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1ef00 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1ef10 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50  &7);.    }.    P
1ef20 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
1ef30 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
1ef40 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1ef50 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1ef60 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54  Pager));.    IOT
1ef70 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
1ef80 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1ef90 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d   pPg->pgno)).  }
1efa0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1efb0 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26 26 20  tmtInUse .   && 
1efc0 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
1efd0 28 70 50 67 29 20 0a 20 20 20 26 26 20 28 69 6e  (pPg) .   && (in
1efe0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1eff0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20  ger->stmtSize . 
1f000 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1f010 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
1f020 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
1f030 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
1f040 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
1f050 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
1f060 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  mt!=0 );.    pPa
1f070 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1f080 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1f090 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1f0a0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
1f0b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f0c0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
1f0d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f0e0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
1f0f0 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
1f100 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
1f110 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
1f120 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
1f130 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1f140 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
1f150 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
1f160 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1f170 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1f180 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
1f190 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1f1a0 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  ne ){.    /* Ope
1f1b0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
1f1c0 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
1f1d0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1f1e0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1f1f0 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
1f200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f210 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f220 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
1f230 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f240 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  (pPgHdr);.    if
1f250 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f260 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a  ) return rc;.  .
1f270 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1f280 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1f290 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1f2a0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1f2b0 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
1f2c0 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 20 20  (pPgHdr, 24);.  
1f2d0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1f2e0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1f2f0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1f300 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1f310 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
1f320 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
1f330 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1f340 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
1f350 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
1f360 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1f370 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65   .    /* Release
1f380 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
1f390 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
1f3a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1f3b0 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
1f3c0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1f3d0 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
1f3e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f3f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
1f400 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f410 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
1f420 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
1f430 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
1f440 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
1f450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1f460 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1f470 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
1f480 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
1f490 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
1f4a0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
1f4b0 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
1f4c0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
1f4d0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
1f4e0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1f4f0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1f500 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
1f510 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
1f520 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
1f530 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
1f540 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
1f550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f560 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
1f570 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
1f580 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
1f590 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
1f5a0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
1f5b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
1f5c0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1f5d0 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
1f5e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f5f0 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
1f600 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1f610 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
1f620 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
1f630 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
1f640 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
1f650 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
1f660 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f670 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
1f680 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1f690 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
1f6a0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
1f6b0 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
1f6c0 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
1f6d0 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
1f6e0 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
1f6f0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1f700 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
1f710 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f720 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61  seOne(Pager *pPa
1f730 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
1f740 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
1f750 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
1f760 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1f770 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41   PAGERTRACE4("DA
1f780 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
1f790 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
1f7a0 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
1f7b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
1f7c0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
1f7d0 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20   nTrunc);..  /* 
1f7e0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
1f7f0 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
1f800 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
1f810 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
1f820 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1f830 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1f840 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
1f850 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1f860 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1f870 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
1f880 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
1f890 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1f8a0 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
1f8b0 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
1f8c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f8d0 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a  lOpen );..    /*
1f8e0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1f8f0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
1f900 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f910 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
1f920 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1f930 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
1f940 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
1f950 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1f960 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
1f970 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
1f980 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
1f990 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
1f9a0 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
1f9b0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1f9c0 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
1f9d0 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
1f9e0 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
1f9f0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
1fa00 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
1fa10 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
1fa20 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1fa30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1fa40 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1fa50 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
1fa60 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1fa70 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1fa80 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1fa90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1faa0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23  oto sync_exit;.#
1fab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fac0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1fad0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1fae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1faf0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1fb00 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1fb10 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1fb20 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1fb30 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69  s.        ** bei
1fb40 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
1fb50 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
1fb60 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
1fb70 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
1fb80 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
1fb90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1fba0 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
1fbb0 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
1fbc0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1fbd0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  er);.        for
1fbe0 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1fbf0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1fc00 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1fc10 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67        if( !(pPag
1fc20 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69  er->aInJournal[i
1fc30 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29  /8] & (1<<(i&7))
1fc40 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1fc50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fc60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1fc70 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1fc80 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
1fc90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fca0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fcb0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1fcc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fcd0 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1fce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fcf0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1fd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fd10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fd20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fd30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fd40 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a       } .      }.
1fd50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
1fd60 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
1fd70 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
1fd80 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
1fd90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fda0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fdb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
1fdc0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1fdd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1fde0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1fdf0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1fe00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fe10 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fe20 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21  .    if( nTrunc!
1fe30 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1fe40 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1fe50 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1fe60 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
1fe70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fe80 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fe90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1fea0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
1feb0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
1fec0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fed0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
1fee0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1fef0 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1ff00 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1ff10 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1ff20 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1ff30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1ff40 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1ff50 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1ff60 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  = 0;..    /* Syn
1ff70 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1ff80 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
1ff90 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
1ffa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1ffb0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1ffc0 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20  er->fd, 0);.    
1ffd0 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
1ffe0 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
1fff0 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67  ager))..    pPag
20000 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
20010 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73  R_SYNCED;.  }els
20020 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e  e if( MEMDB && n
20030 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
20040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20050 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
20060 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a  , nTrunc);.  }..
20070 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28  sync_exit:.  if(
20080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
20090 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
200a0 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
200b0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
200c0 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
200d0 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
200e0 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f  e.     * lock to
200f0 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
20100 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
20110 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
20120 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65  ince .     * the
20130 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
20140 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
20150 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 27 73 0a  onsistent, it's.
20160 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f       * better to
20170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
20180 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  USY..     */.   
20190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
201a0 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  Y;.  }.  return 
201b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
201c0 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
201d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
201e0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
201f0 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
20200 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
20210 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
20220 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
20230 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
20240 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
20250 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
20260 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
20270 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
20280 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
20290 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
202a0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
202b0 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
202c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
202d0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
202e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
202f0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
20300 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
20310 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
20320 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
20330 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
20340 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20350 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41  _ERROR;.  }.  PA
20360 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  GERTRACE2("COMMI
20370 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
20380 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
20390 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
203a0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
203b0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
203c0 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
203d0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50  ( pPg ){.      P
203e0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
203f0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
20400 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
20410 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
20420 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
20430 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
20440 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
20450 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
20460 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
20470 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
20480 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
20490 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
204a0 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
204b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
204c0 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
204d0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  y;.    }.    pPa
204e0 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
204f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
20500 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
20510 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
20520 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
20530 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
20540 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
20550 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
20560 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
20570 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
20580 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
20590 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
205a0 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
205b0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
205c0 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
205d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
205e0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
205f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20600 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
20610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20620 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
20630 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
20640 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
20650 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20670 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
20680 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50  ER_SYNCED || !pP
20690 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
206a0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
206b0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
206c0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
206d0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
206e0 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
206f0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
20700 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
20710 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
20720 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
20730 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
20740 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
20750 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
20760 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
20770 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
20780 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
20790 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
207a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
207b0 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
207c0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
207d0 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
207e0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
207f0 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
20800 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  col or unless so
20810 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
20820 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
20830 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
20840 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
20850 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
20860 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
20870 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
20880 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
20890 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
208a0 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
208b0 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
208c0 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
208d0 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
208e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
208f0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
20900 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
20910 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
20920 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
20930 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f   PAGERTRACE2("RO
20940 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
20950 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20960 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
20970 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
20980 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
20990 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
209a0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
209b0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
209c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
209d0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
209e0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
209f0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
20a00 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
20a10 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
20a20 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
20a30 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
20a40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
20a50 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
20a60 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
20a70 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
20a80 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
20a90 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
20aa0 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
20ab0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
20ac0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
20ad0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
20ae0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
20af0 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
20b00 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
20b10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20b20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
20b30 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
20b40 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
20b50 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
20b60 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
20b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20b80 50 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47  PAGERTRACE3("PAG
20b90 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
20ba0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
20bb0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
20bc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20bd0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
20be0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
20bf0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
20c00 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
20c10 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69  ;.      pHist->i
20c20 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
20c30 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
20c40 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
20c50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
20c60 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
20c70 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
20c80 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
20c90 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61  er(p, pPager->pa
20ca0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
20cb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
20cc0 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
20cd0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
20ce0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
20cf0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
20d00 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
20d10 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
20d20 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
20d30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
20d40 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
20d50 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
20d60 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
20d70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20d80 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
20d90 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
20da0 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
20db0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
20dc0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
20dd0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
20de0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
20df0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
20e00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
20e10 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
20e20 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
20e30 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
20e40 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
20e50 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
20e60 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
20e70 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
20e80 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
20e90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
20ea0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
20eb0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
20ec0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
20ed0 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
20ee0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
20ef0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20f00 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
20f10 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
20f20 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
20f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20f40 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
20f50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
20f60 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20f70 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
20f80 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f  .  }.  /* pager_
20f90 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a  reset(pPager); *
20fa0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
20fb0 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
20fc0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20fd0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
20fe0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
20ff0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
21000 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
21010 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
21020 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
21030 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
21040 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
21050 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
21060 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
21070 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
21080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21090 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
210a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
210b0 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
210c0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
210d0 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
210e0 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
210f0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
21100 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
21110 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
21120 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21130 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
21140 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
21150 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
21160 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
21170 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
21180 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
21190 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
211a0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
211b0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
211c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
211d0 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
211e0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
211f0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
21200 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
21210 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
21220 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
21230 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
21240 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
21250 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
21260 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
21270 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
21280 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
21290 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
212a0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
212b0 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
212c0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
212d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
212e0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
212f0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
21300 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
21310 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
21320 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
21330 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
21340 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
21350 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
21360 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
21370 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
21380 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
21390 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
213a0 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
213b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
213c0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
213d0 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
213e0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
213f0 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
21400 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
21410 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
21420 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
21430 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
21440 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
21450 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
21460 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
21470 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
21480 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21490 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
214a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
214b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
214c0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
214d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
214e0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
214f0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
21500 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
21510 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41  bSize>=0 );.  PA
21520 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
21530 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
21540 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
21550 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
21560 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
21570 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
21580 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
21590 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
215a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
215b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
215c0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
215d0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
215e0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
215f0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
21600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21620 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
21630 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
21640 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
21650 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
21660 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
21670 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
21680 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71  ==0 ){.    /* sq
21690 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
216a0 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
216b0 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  OCK); */.    ret
216c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
216d0 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
216e0 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
216f0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
21700 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
21710 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
21720 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
21730 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
21740 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
21750 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
21760 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
21770 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
21780 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
21790 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
217a0 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
217b0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
217c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
217d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
217e0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
217f0 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
21800 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
21810 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
21820 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
21830 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21840 72 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67 65  rOpentemp(&pPage
21850 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
21860 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
21870 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
21880 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
21890 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
218a0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
218b0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
218c0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
218d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
218e0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
218f0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
21900 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
21910 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
21920 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
21930 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
21940 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
21950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21960 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
21970 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
21980 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
21990 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
219a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
219b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
219c0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
219d0 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50  g, *pNext;.    P
219e0 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
219f0 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
21a00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
21a10 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
21a20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21a30 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
21a40 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
21a50 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
21a60 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ate(pPager->stfd
21a70 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  , 0); */.      s
21a80 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
21a90 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20  r->aInStmt );.  
21aa0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
21ab0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  tmt = 0;.    }el
21ac0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  se{.      for(pP
21ad0 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
21ae0 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
21af0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
21b00 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
21b10 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
21b20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
21b30 20 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e   pNext = pHist->
21b40 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
21b50 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
21b60 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
21b70 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
21b80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
21b90 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Hist->pPrevStmt 
21ba0 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
21bb0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
21bc0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
21bd0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
21be0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
21bf0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
21c00 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
21c10 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
21c20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
21c30 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
21c40 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
21c50 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
21c60 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
21c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
21c90 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
21ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21cb0 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
21cc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21cd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
21ce0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
21cf0 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  se ){.    PAGERT
21d00 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
21d10 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
21d20 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
21d30 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
21d40 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
21d50 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
21d60 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66   *pHist;.      f
21d70 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
21d80 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
21d90 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29  Hist->pNextStmt)
21da0 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20  {.        pHist 
21db0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
21dc0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
21dd0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
21de0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
21df0 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
21e00 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
21e10 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
21e20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
21e30 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21e40 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
21e50 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
21e60 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
21e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21e80 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
21e90 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
21ea0 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
21eb0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
21ec0 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
21ed0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21ee0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
21ef0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21f00 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
21f10 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
21f20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
21f30 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
21f40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
21f50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21f60 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
21f70 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
21f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21f90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21fa0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
21fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21fc0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
21fd0 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
21fe0 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
21ff0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
22000 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
22010 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
22020 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
22030 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
22040 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
22050 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
22060 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
22070 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
22080 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
22090 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
220a0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
220b0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
220c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
220d0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
220e0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
220f0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
22100 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
22110 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
22120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22130 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
22140 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
22150 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
22160 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
22170 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
22180 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
22190 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
221a0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
221b0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
221c0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
221d0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
221e0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
221f0 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
22200 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
22210 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
22220 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22230 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
22240 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
22250 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
22260 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
22270 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
22280 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
22290 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
222a0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
222b0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
222c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
222d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
222e0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
222f0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69   Move the page i
22300 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61  dentified by pDa
22310 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  ta to location p
22320 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
22330 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
22340 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
22350 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65  ces to the curre
22360 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66  nt page pgno. If
22370 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a   current page.**
22380 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
22390 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  eady in the roll
223a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
223b0 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
223c0 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74  there by.** by t
223d0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65  his routine. The
223e0 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f   same applies to
223f0 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20   the page pData 
22400 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74  refers to on ent
22410 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ry to.** this ro
22420 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
22430 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
22440 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  age refered to b
22450 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76  y pData remain v
22460 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
22470 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
22480 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22490 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e  page pData (i.e.
224a0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
224b0 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
224c0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
224d0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
224e0 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
224f0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
22500 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
22510 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
22520 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
22530 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
22540 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
22550 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
22560 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
22570 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
22580 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
22590 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
225a0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
225b0 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
225c0 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
225d0 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
225e0 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
225f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
22600 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tive)..*/.int sq
22610 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
22620 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
22630 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50  , DbPage *pPg, P
22640 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
22650 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
22660 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
22670 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
22680 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
22690 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45  Ref>0 );..  PAGE
226a0 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64  RTRACE5("MOVE %d
226b0 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
226c0 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
226d0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
226e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
226f0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
22700 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
22710 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
22720 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
22730 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
22740 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72   pgno))..  pager
22750 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
22760 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  );.  if( pPg->ne
22770 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
22780 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
22790 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
227a0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
227b0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
227c0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
227d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
227e0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
227f0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
22800 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
22810 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
22820 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
22830 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
22840 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
22850 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
22860 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
22870 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
22880 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
22890 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
228a0 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
228b0 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
228c0 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
228d0 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
228e0 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
228f0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
22900 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
22910 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
22920 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
22930 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
22940 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
22950 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
22960 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
22970 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
22980 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
22990 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
229a0 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b  pPgOld);.    mak
229b0 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a  eClean(pPgOld);.
229c0 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e      if( pPgOld->
229d0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
229e0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
229f0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
22a00 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
22a10 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  nal = 1;.      p
22a20 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  Pg->needSync = 1
22a30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22a40 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
22a50 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
22a60 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70   /* Change the p
22a70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
22a80 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  Pg and insert it
22a90 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61   into the new ha
22aa0 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61  sh-chain. */.  a
22ab0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
22ac0 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  ;.  pPg->pgno = 
22ad0 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f  pgno;.  h = pgno
22ae0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
22af0 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67  h-1);.  if( pPag
22b00 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a  er->aHash[h] ){.
22b10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22b20 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
22b30 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
22b40 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
22b50 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
22b60 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
22b70 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
22b80 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
22b90 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
22ba0 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70   = pPg;.  pPg->p
22bb0 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20  PrevHash = 0;.. 
22bc0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
22bd0 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
22be0 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66  Cache = 1;..  if
22bf0 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
22c00 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
22c10 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
22c20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
22c30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
22c40 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
22c50 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
22c60 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
22c70 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
22c80 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
22c90 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
22ca0 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
22cb0 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
22cc0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
22cd0 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
22ce0 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c  Pager.aInJournal
22cf0 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65   bit has been se
22d00 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f  t. This needs to
22d10 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20   be remedied by 
22d20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74  loading.    ** t
22d30 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
22d40 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
22d50 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
22d60 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  dr.needSync flag
22d70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22d80 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
22d90 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
22da0 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
22db0 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
22dc0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
22dd0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
22de0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
22df0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
22e00 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   rc;.    PgHdr *
22e10 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
22e20 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
22e30 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
22e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
22e50 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
22e60 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
22e70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22e80 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
22e90 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
22ea0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
22eb0 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79    pPgHdr->needSy
22ec0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
22ed0 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  dr->inJournal = 
22ee0 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79  1;.    makeDirty
22ef0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71  (pPgHdr);.    sq
22f00 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
22f10 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPgHdr);.  }..  
22f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22f30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22f40 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
22f50 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
22f60 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
22f70 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
22f80 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
22f90 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
22fa0 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52  {.  return PGHDR
22fb0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d  _TO_DATA(pPg);.}
22fc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
22fd0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
22fe0 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
22ff0 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
23000 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
23010 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
23020 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
23030 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
23040 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
23050 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
23060 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
23070 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65  Pg->pPager;.  re
23080 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48  turn (pPager?PGH
23090 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
230a0 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a   pPager):0);.}..
230b0 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
230c0 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66  e locking-mode f
230d0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50  or this pager. P
230e0 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d  arameter eMode m
230f0 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66  ust be one.** of
23100 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
23110 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f  DE_QUERY, PAGER_
23120 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
23130 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f  AL or .** PAGER_
23140 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
23150 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61  USIVE. If the pa
23160 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
23170 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74  QUERY, then.** t
23180 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
23190 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
231a0 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
231b0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
231c0 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65  d value is eithe
231d0 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  r PAGER_LOCKINGM
231e0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a  ODE_NORMAL or.**
231f0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
23200 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e  DE_EXCLUSIVE, in
23210 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72  dicating the cur
23220 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
23230 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69  pdated).** locki
23240 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  ng-mode..*/.int 
23250 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
23260 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  ingMode(Pager *p
23270 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
23280 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  ){.  assert( eMo
23290 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
232a0 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20  GMODE_QUERY.    
232b0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
232c0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
232d0 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  ODE_NORMAL.     
232e0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
232f0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
23300 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
23310 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
23320 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
23330 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Y<0 );.  assert(
23340 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
23350 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20  DE_NORMAL>=0 && 
23360 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
23370 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29  E_EXCLUSIVE>=0 )
23380 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30  ;.  if( eMode>=0
23390 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
233a0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61  pFile ){.    pPa
233b0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
233c0 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a  de = eMode;.  }.
233d0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
233e0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
233f0 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ode;.}..#if defi
23400 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
23410 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
23420 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
23430 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
23440 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
23450 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68  file lock for th
23460 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
23470 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
23480 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f  ue is one of NO_
23490 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
234a0 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
234b0 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ,.** PENDING_LOC
234c0 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  K, or EXCLUSIVE_
234d0 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LOCK..*/.int sql
234e0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73 74 61  ite3PagerLocksta
234f0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
23500 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
23510 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70  te3OsLockState(p
23520 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65  Pager->fd);.}.#e
23530 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
23540 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
23550 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
23560 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
23570 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
23580 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
23590 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
235a0 72 52 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  rRefdump(Pager *
235b0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
235c0 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
235d0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
235e0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
235f0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
23600 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
23610 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
23620 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23630 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25  "PAGE %3d addr=%
23640 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  p nRef=%d\n", . 
23650 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
23660 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
23670 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
23680 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
23690 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
236a0 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.