/ Hex Artifact Content
Login

Artifact 6c70842fe6621968be7d87143032640b7bc7f3f8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 32  : pager.c,v 1.32
0350: 32 20 32 30 30 37 2f 30 34 2f 30 35 20 31 34 3a  2 2007/04/05 14:
0360: 32 39 3a 34 33 20 64 61 6e 69 65 6c 6b 31 39 37  29:43 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63   OsFile.** struc
0710: 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65  t as it's argume
0720: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  nt..*/.#define P
0730: 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29  AGERID(p) ((int)
0740: 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65  (p->fd)).#define
0750: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0760: 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a  ) ((int)fd)../*.
0770: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0780: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0790: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
07a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
07b0: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
07c0: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
07d0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07f0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
0800: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0810: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
0820: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
0830: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0840: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0850: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0860: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0870: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0880: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08a0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
08b0: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
08c0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
08d0: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
0910: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
0920: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0950: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0960: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0980: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0990: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
09a0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
09b0: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
09c0: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
09d0: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09e0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
0a10: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
0a20: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
0a30: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a60: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a70: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a80: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0ab0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0ac0: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0af0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0b00: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0b10: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0b20: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0b30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b40: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b50: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b60: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0ba0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0bb0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0bc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0be0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bf0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0c00: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0c30: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c40: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c50: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c60: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c70: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c80: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0ca0: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0cb0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0cc0: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cf0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0d00: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0d10: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0d30: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d40: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d50: 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20  emove or.**     
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a    truncate the j
0d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
0d90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0da0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0db0: 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62            will b
0dc0: 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  e committed..**.
0dd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0de0: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41  e comes up in PA
0df0: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0e00: 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a   first time a.**
0e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
0e20: 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73  () occurs, the s
0e30: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e40: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
0e50: 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70  ..** After all p
0e60: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ages have been r
0e70: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
0e80: 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28  lite_page_unref(
0e90: 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ),.** the state 
0ea0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b  transitions back
0eb0: 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   to PAGER_UNLOCK
0ec0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0ed0: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0ee0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
0ef0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f00: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f10: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f20: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
0f40: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0f50: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0f60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0f70: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0f80: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0f90: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0fa0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
0fb0: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
0fc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0fd0: 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  ).** PAGER_RESER
0fe0: 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74  VED means that t
0ff0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20  here is an open 
1000: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1010: 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ..** The transit
1020: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1030: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62 65  LUSIVE occurs be
1040: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1050: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1060: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1070: 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65 73  e, though writes
1080: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1090: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75  .** journal occu
10a0: 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41 47  rs with just PAG
10b0: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66  ER_RESERVED.  Af
10c0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61  ter an sqlite3Pa
10d0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  gerRollback().**
10e0: 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
10f0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1100: 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e 20  , the state can 
1110: 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  go back to PAGER
1120: 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69  _SHARED,.** or i
1130: 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50 41  t can stay at PA
1140: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66  GER_EXCLUSIVE if
1150: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
1160: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
1170: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1180: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1190: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
11a0: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
11b0: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
11c0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
11d0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
11e0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
11f0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
1200: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1210: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1220: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1230: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1240: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1250: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1260: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1270: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1280: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1290: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
12a0: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
12b0: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
12c0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
12d0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
12e0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12f0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
1300: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
1310: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1320: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1330: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1340: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1350: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1360: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1370: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1380: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1390: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
13a0: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
13b0: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
13c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
13d0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
13e0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
13f0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
1400: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
1410: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1420: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1430: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1440: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1450: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1460: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1470: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1480: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1490: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
14a0: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
14b0: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
14c0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
14d0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
14e0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
14f0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
1500: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
1510: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1520: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1530: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1560: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1570: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1580: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
15a0: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
15b0: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
15c0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
15d0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
15e0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
15f0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
1600: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
1610: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1620: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1630: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1640: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1650: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1660: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1670: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1680: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1690: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
16a0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
16b0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
16c0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
16d0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
16e0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
16f0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1700: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1710: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1720: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1730: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1740: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1750: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1760: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1770: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1780: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17a0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
17b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
17c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
17d0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
17e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
17f0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1800: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1810: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1820: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1830: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1840: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1850: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1860: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1870: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1880: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1890: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
18a0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
18b0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
18c0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
18d0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
18e0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
18f0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1900: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1910: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1920: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1930: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1940: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1950: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1960: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1970: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1980: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1990: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
19a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
19b0: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
19c0: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
19d0: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
19e0: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
19f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1a00: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
1a10: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
1a20: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
1a50: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
1a60: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a70: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a80: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a90: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1aa0: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1ab0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1ac0: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1ad0: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1ae0: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1af0: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1b00: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1b20: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1b30: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1b40: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
1b50: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
1b60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
1b70: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
1b80: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
1b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ba0: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
1bb0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1bc0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
1bd0: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf0: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
1c00: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
1c10: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
1c20: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1c40: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77   if we need to w
1c50: 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65  rite back change
1c60: 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  s */.  u8 needSy
1c70: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1c80: 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f        /* Sync jo
1c90: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69  urnal before wri
1ca0: 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a  ting this page *
1cb0: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1cc0: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1cd0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
1ce0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
1cf0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1d00: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
1d30: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
1d40: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
1d50: 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20  y, *pPrevDirty; 
1d60: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
1d70: 73 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73  s */.  u32 notUs
1d80: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1d90: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1da0: 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20  space */.#ifdef 
1db0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1dc0: 45 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73  ES.  u32 pageHas
1dd0: 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70  h;.#endif.  /* p
1de0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1df0: 62 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61  bytes of page da
1e00: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68  ta follow this h
1e10: 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61  eader */.  /* Pa
1e20: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
1e30: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66   of local data f
1e40: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64  ollow the page d
1e50: 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ata */.};../*.**
1e60: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
1e70: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
1e80: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
1e90: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
1ea0: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
1eb0: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
1ec0: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
1ed0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
1ee0: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
1ef0: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
1f00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1f10: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
1f20: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1f30: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
1f40: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
1f50: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
1f60: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1f70: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
1f80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
1f90: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
1fa0: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
1fb0: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
1fc0: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
1fd0: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
1fe0: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
1ff0: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
2000: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
2010: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
2020: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
2030: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
2040: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
2050: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
2060: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
2070: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
2080: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
2090: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
20a0: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
20b0: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
20c0: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
20d0: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
20e0: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
20f0: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
2100: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
2110: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
2120: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
2130: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
2140: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2150: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
2160: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ment */.};../*.*
2170: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
2180: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
2190: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
21a0: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
21b0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
21c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
21d0: 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d  (P,D,N,X) if( P-
21e0: 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d  >xCodec!=0 ){ P-
21f0: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
2200: 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23  cArg,D,N,X); }.#
2210: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
2220: 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29  ,D,N,X) ((char*)
2230: 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d  (P->xCodec!=0?P-
2240: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
2250: 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a  cArg,D,N,X):D)).
2260: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
2270: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f  ODEC1(P,D,N,X) /
2280: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
2290: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
22a0: 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23  ,X) ((char*)D).#
22b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
22c0: 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74  vert a pointer t
22d0: 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61  o a PgHdr into a
22e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20   pointer to its 
22f0: 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b  data.** and back
2300: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69   again..*/.#defi
2310: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ne PGHDR_TO_DATA
2320: 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28  (P)  ((void*)(&(
2330: 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  P)[1])).#define 
2340: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29  DATA_TO_PGHDR(D)
2350: 20 20 28 26 28 28 50 67 48 64 72 2a 29 28 44 29    (&((PgHdr*)(D)
2360: 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50  )[-1]).#define P
2370: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c  GHDR_TO_EXTRA(G,
2380: 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68  P) ((void*)&((ch
2390: 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28  ar*)(&(G)[1]))[(
23a0: 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23  P)->pageSize]).#
23b0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
23c0: 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20  HIST(P,PGR)  \. 
23d0: 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67 48             ((PgH
23e0: 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a  istory*)&((char*
23f0: 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52  )(&(P)[1]))[(PGR
2400: 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52  )->pageSize+(PGR
2410: 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a  )->nExtra])../*.
2420: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
2430: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
2440: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2450: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
2460: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
2470: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
2480: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
2490: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
24a0: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
24b0: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
24c0: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
24d0: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
24e0: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
24f0: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
2500: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
2510: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
2520: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
2530: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
2540: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
2550: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
2560: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
2570: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
2580: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
2590: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
25a0: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
25b0: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
25c0: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
25d0: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
25e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
25f0: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
2600: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
2610: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
2620: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
2630: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f  successfully..*/
2640: 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a  .struct Pager {.
2650: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
2660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2670: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
2680: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2690: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
26a0: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
26b0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
26c0: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
26d0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
26e0: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
26f0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2700: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
2710: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
2720: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2730: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2750: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
2760: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
2770: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
2780: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2790: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
27a0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
27b0: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
27c0: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e0: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
27f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
2800: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
2810: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
2820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2830: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
2840: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
2850: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
2860: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2880: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
2890: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
28a0: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
28d0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
28e0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
28f0: 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f 66  s */.  u8 full_f
2900: 73 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  sync;           
2910: 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c     /* Use F_FULL
2920: 46 53 59 4e 43 20 77 68 65 6e 20 61 76 61 69 6c  FSYNC when avail
2930: 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 61  able */.  u8 sta
2940: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2950: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2960: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2970: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2980: 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65  */.  u8 tempFile
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   /* zFilename is
29b0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
29c0: 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e  e */.  u8 readOn
29d0: 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
29e0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
29f0: 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
2a00: 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64  ase */.  u8 need
2a10: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2a20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a30: 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65  an fsync() is ne
2a40: 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  eded on the jour
2a50: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2a60: 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  yCache;         
2a70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a80: 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61 76  cached pages hav
2a90: 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  e changed */.  u
2aa0: 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  8 alwaysRollback
2ab0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69  ;          /* Di
2ac0: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
2ad0: 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67  ck() for all pag
2ae0: 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62  es */.  u8 memDb
2af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b00: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
2b10: 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20  nhibit all file 
2b20: 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  I/O */.  u8 setM
2b30: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
2b40: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b50: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
2b60: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
2b70: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
2b80: 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  tSync;          
2b90: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
2ba0: 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20   While true, do 
2bb0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
2bc0: 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c  che */.  u8 excl
2bd0: 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20  usiveMode;      
2be0: 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e       /* Boolean.
2bf0: 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67   True if locking
2c00: 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45  _mode==EXCLUSIVE
2c10: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
2c20: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
2c30: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
2c40: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2c50: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
2c60: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2c90: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2ca0: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
2cb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2cc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cd0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
2ce0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
2cf0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2d00: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
2d10: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2d20: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
2d30: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
2d40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2d50: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
2d60: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
2d70: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
2d80: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2da0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2db0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2dc0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2dd0: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
2de0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
2df0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
2e00: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
2e10: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
2e20: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2e30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2e40: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2e50: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2e60: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2e80: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2e90: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2ea0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2eb0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ed0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2ee0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
2ef0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2f00: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2f10: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
2f20: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
2f30: 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20  int nMaxPage;   
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2f50: 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f  igh water mark o
2f60: 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  f nPage */.  int
2f70: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2f90: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2fa0: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
2fb0: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
2fc0: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2fe0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2ff0: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
3000: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  ache */.  u8 *aI
3010: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
3020: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
3030: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
3040: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3050: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
3060: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
3070: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
3080: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3090: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
30a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
30b0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
30c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
30d0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
30e0: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
3110: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
3120: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
3130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
3140: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
3150: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
3160: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69   files */.  OsFi
3170: 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20  le *fd, *jfd;   
3180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3190: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
31a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
31b0: 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  rnal */.  OsFile
31c0: 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20   *stfd;         
31d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
31e0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
31f0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3200: 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61  urnal*/.  BusyHa
3210: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
3220: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
3230: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
3240: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64  andler */.  PgHd
3250: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
3260: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
3270: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
3280: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
3290: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
32a0: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
32b0: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
32c0: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
32d0: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
32e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
32f0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
3300: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
3310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3320: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
3330: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3340: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3350: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3370: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72   List of all dir
3380: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36  ty pages */.  i6
3390: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
33a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
33b0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
33c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
33d0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
33e0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
33f0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
3400: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
3410: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3420: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3430: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3440: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3450: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3460: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3470: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3480: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3490: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
34a0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
34b0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
34c0: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
34e0: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
34f0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3500: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3520: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3530: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3540: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3550: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3560: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3570: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3580: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3590: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
35a0: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
35b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
35c0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
35d0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
35e0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
35f0: 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b  r)(DbPage*,int);
3600: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
3610: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
3620: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
3630: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
3640: 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20  DbPage*,int);   
3650: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
3660: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
3670: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
3680: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
3690: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
36a0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
36b0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
36c0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
36d0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
36e0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
36f0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
3700: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3710: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3720: 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61  #endif.  int nHa
3730: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
3740: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
3750: 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74  the pager hash t
3760: 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  able */.  PgHdr 
3770: 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20  **aHash;        
3780: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
3790: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
37a0: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
37b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
37c0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
37d0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65  ANAGEMENT.  Page
37e0: 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  r *pNext;       
37f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65          /* Linke
3800: 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73  d list of pagers
3810: 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64 20   in this thread 
3820: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72  */.#endif.  char
3830: 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20   *pTmpSpace;    
3840: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
3850: 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  .pageSize bytes 
3860: 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70  of space for tmp
3870: 20 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 69 43   use */.  u32 iC
3880: 68 61 6e 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  hangeCount;     
3890: 20 20 20 20 20 20 2f 2a 20 44 62 20 63 68 61 6e        /* Db chan
38a0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 6f 72 20 77  ge-counter for w
38b0: 68 69 63 68 20 63 61 63 68 65 20 69 73 20 76 61  hich cache is va
38c0: 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  lid */.};../*.**
38d0: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
38e0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
38f0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
3900: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
3910: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
3920: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3930: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3940: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3950: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3960: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3970: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  dif../*.** Journ
3980: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
3990: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
39a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
39b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
39c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
39d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
39e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
39f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
3a00: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
3a10: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
3a20: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3a30: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3a40: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3a50: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3a60: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3a70: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3a80: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3a90: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3aa0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3ab0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3ac0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
3ad0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
3ae0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
3af0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
3b00: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
3b10: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
3b20: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3b30: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3b40: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3b50: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3b60: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3b70: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3b80: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3b90: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3ba0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3bb0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3bc0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
3bd0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3be0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
3bf0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3c00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
3c10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
3c20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3c30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3c40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3c50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3c60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3c70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3c80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3c90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3ca0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3cb0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3cc0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
3cd0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
3ce0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
3cf0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
3d00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
3d10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
3d20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3d30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3d40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3d50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3d60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3d70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3d80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3d90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3da0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3db0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3dc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
3dd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
3de0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
3df0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
3e00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
3e10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
3e20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3e30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3e40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3e50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3e60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3e70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3e80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3e90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3ea0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3eb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3ec0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
3ed0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
3ee0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
3ef0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
3f00: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
3f10: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
3f20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
3f30: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
3f40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3f50: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3f60: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3f70: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3f80: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3f90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3fa0: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3fb0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3fc0: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
3fd0: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
3fe0: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
3ff0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
4000: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
4010: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
4020: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
4030: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
4040: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
4050: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
4060: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
4070: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4080: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
4090: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
40a0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
40b0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
40c0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
40d0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
40e0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
40f0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4100: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4110: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4120: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4130: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
4140: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
4150: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
4160: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
4170: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
4180: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
4190: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
41a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
41b0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
41c0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
41d0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
41e0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
41f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
4200: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
4210: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
4220: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
4230: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
4240: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
4250: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
4260: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
4270: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
4280: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
4290: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
42a0: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
42b0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
42c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
42d0: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
42e0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
42f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
4300: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
4310: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
4320: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
4330: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
4340: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
4350: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
4360: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
4370: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
4380: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
4390: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
43a0: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
43b0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
43c0: 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54  x) ((PENDING_BYT
43d0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
43e0: 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ))+1)../*.** The
43f0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
4400: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4410: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4420: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4430: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4440: 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66  /*.** Enable ref
4450: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61  erence count tra
4460: 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67  cking (for debug
4470: 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23  ging) here:.*/.#
4480: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
4490: 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  UG.  int pager3_
44a0: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
44b0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
44c0: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
44d0: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
44e0: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
44f0: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
4500: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4510: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
4520: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4530: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
4540: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
4550: 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d  nRef=%-3d total=
4560: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
4570: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
4580: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
4590: 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  , p->pPager->nRe
45a0: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
45b0: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
45c0: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
45d0: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
45e0: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
45f0: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
4600: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
4610: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
4620: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4630: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
4640: 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  of the pager has
4650: 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e  h table to N.  N
4660: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
4670: 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73  .** of two..*/.s
4680: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
4690: 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
46a0: 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
46b0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64  , int N){.  PgHd
46c0: 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b  r **aHash, *pPg;
46d0: 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26  .  assert( N>0 &
46e0: 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29  & (N&(N-1))==0 )
46f0: 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c 69  ;.  aHash = sqli
4700: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
4710: 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a  (aHash[0])*N );.
4720: 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29    if( aHash==0 )
4730: 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65  {.    /* Failure
4740: 20 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f   to rehash is no
4750: 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20  t an error.  It 
4760: 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72  is only a perfor
4770: 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20  mance hit. */.  
4780: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4790: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
47a0: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
47b0: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e 3b 0a  ger->nHash = N;.
47c0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
47d0: 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  = aHash;.  for(p
47e0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
47f0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
4800: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 6e  NextAll){.    in
4810: 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70 50 67  t h;.    if( pPg
4820: 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
4830: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
4840: 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
4850: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
4860: 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  0 );.      conti
4870: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
4880: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
4890: 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  N-1);.    pPg->p
48a0: 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61 73 68  NextHash = aHash
48b0: 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61 48 61  [h];.    if( aHa
48c0: 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20 20 61  sh[h] ){.      a
48d0: 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
48e0: 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  sh = pPg;.    }.
48f0: 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d 20 70      aHash[h] = p
4900: 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72  Pg;.    pPg->pPr
4910: 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20 7d 0a  evHash = 0;.  }.
4920: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
4930: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
4940: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
4950: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4960: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
4970: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
4980: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
4990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
49a0: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
49b0: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
49c0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
49d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
49e0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
49f0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
4a00: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
4a10: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
4a20: 74 20 72 65 61 64 33 32 62 69 74 73 28 4f 73 46  t read32bits(OsF
4a30: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52  ile *fd, u32 *pR
4a40: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
4a50: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
4a60: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
4a70: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
4a80: 65 6f 66 28 61 63 29 29 3b 0a 20 20 69 66 28 20  eof(ac));.  if( 
4a90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4aa0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 28 61 63  .    *pRes = (ac
4ab0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4ac0: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4ad0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20 7d  <8) | ac[3];.  }
4ae0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4af0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4b00: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4b10: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
4b20: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
4b30: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
4b40: 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 74 33  static void put3
4b50: 32 62 69 74 73 28 63 68 61 72 20 2a 61 63 2c 20  2bits(char *ac, 
4b60: 75 33 32 20 76 61 6c 29 7b 0a 20 20 61 63 5b 30  u32 val){.  ac[0
4b70: 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20  ] = (val>>24) & 
4b80: 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20  0xff;.  ac[1] = 
4b90: 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66  (val>>16) & 0xff
4ba0: 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c  ;.  ac[2] = (val
4bb0: 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >>8) & 0xff;.  a
4bc0: 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66  c[3] = val & 0xf
4bd0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  f;.}../*.** Writ
4be0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
4bf0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
4c00: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4c10: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4c20: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4c30: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4c40: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4c50: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4c60: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4c70: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4c80: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  d, u32 val){.  c
4c90: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4ca0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4cb0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4cc0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4cd0: 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   4);.}../*.** Re
4ce0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
4cf0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f  ger at offset 'o
4d00: 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20  ffset' from the 
4d10: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
4d20: 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65  by.** page heade
4d30: 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  r 'p'..*/.static
4d40: 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62   u32 retrieve32b
4d50: 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e  its(PgHdr *p, in
4d60: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
4d70: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
4d80: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
4d90: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
4da0: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
4db0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63  t];.  return (ac
4dc0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
4dd0: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
4de0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a  <8) | ac[3];.}..
4df0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
4e00: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
4e10: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72  alled when an er
4e20: 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
4e30: 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63  n the pager.** c
4e40: 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  ode. The first a
4e50: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
4e60: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
4e70: 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  r structure, the
4e80: 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65  .** second the e
4e90: 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20  rror-code about 
4ea0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
4eb0: 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66 75  y a pager API fu
4ec0: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20  nction. .** The 
4ed0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
4ee0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
4ef0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4f00: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
4f10: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
4f20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4f30: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
4f40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
4f50: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
4f60: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
4f70: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
4f80: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
4f90: 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69  API calls on thi
4fa0: 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20  s Pager.** will 
4fb0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
4fc0: 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rn the same erro
4fd0: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
4fe0: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
4ff0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
5000: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
5010: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
5020: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5030: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
5040: 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65  TE_FULL || pPage
5050: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
5060: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a 20  TE_OK );.  if(. 
5070: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46     rc2==SQLITE_F
5080: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ULL ||.    rc2==
5090: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a  SQLITE_IOERR ||.
50a0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
50b0: 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20  CORRUPT.  ){.   
50c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
50d0: 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74   = rc;.  }.  ret
50e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
50f0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
5100: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
5110: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
5120: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
5130: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
5140: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
5150: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
5160: 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68 61  pPage){.  u32 ha
5170: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
5180: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5190: 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67   *pData = (unsig
51a0: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
51b0: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 3b  _TO_DATA(pPage);
51c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
51d0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
51e0: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
51f0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69 29   hash = (hash+i)
5200: 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20  ^pData[i];.  }. 
5210: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
5220: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
5230: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
5240: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
5250: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
5260: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
5270: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
5280: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
5290: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
52a0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
52b0: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
52c0: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
52d0: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
52e0: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
52f0: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
5300: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
5310: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
5320: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
5330: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
5340: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
5350: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
5360: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
5370: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
5380: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
5390: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
53a0: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
53b0: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
53c0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
53d0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
53e0: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
53f0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
5400: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
5410: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
5420: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5430: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
5440: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
5450: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
5460: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
5480: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
5490: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
54a0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
54b0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
54c0: 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61  eMalloc(). *pzMa
54d0: 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74  ster is.** set t
54e0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d  o point at the m
54f0: 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
5500: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
5510: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
5520: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70   sqliteFree() *p
5530: 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  zMaster..**.** I
5540: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
5550: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
5560: 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74   present *pzMast
5570: 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  er is set to 0 a
5580: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
5590: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
55a0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
55b0: 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65  erJournal(OsFile
55c0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a   *pJrnl, char **
55d0: 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  pzMaster){.  int
55e0: 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a   rc;.  u32 len;.
55f0: 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32    i64 szJ;.  u32
5600: 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b   cksum;.  int i;
5610: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5620: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5630: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5640: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5650: 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72   */..  *pzMaster
5660: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
5670: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
5680: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
5690: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
56a0: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
56b0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
56c0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
56d0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20  Jrnl, szJ-16);. 
56e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
56f0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5700: 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62   .  rc = read32b
5710: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29  its(pJrnl, &len)
5720: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5730: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5740: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
5750: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b  2bits(pJrnl, &ck
5760: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
5770: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5780: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5790: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
57a0: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a  nl, aMagic, 8);.
57b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
57c0: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
57d0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
57e0: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
57f0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
5800: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
5810: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20  , szJ-16-len);. 
5820: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5830: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5840: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
5850: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
5860: 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66  loc(len+1);.  if
5870: 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a  ( !*pzMaster ){.
5880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5890: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
58a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
58b0: 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74  d(pJrnl, *pzMast
58c0: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
58d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
58e0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
58f0: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
5900: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
5910: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5920: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
5930: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
5940: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
5950: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
5960: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
5970: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
5980: 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b   -= (*pzMaster)[
5990: 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  i];.  }.  if( ck
59a0: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
59b0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
59c0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
59d0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
59e0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
59f0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
5a00: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
5a10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
5a20: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
5a30: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
5a40: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
5a50: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
5a60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5a70: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
5a80: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
5a90: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
5aa0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
5ab0: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5ac0: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5ad0: 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  er = 0;.  }else{
5ae0: 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29  .    (*pzMaster)
5af0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
5b00: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
5b10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5b20: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
5b30: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
5b40: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
5b50: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
5b60: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
5b70: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
5b80: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
5b90: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
5ba0: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
5bb0: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
5bc0: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
5bd0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
5be0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
5bf0: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
5c00: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
5c10: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c40: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
5cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
5ce0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5cf0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
5d00: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
5d10: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
5d20: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
5d30: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
5d40: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
5d50: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5d60: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5d70: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5d80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5d90: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5da0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5dc0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5dd0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5de0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5df0: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
5e00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
5e10: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
5e20: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
5e30: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5e40: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
5e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
5e60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
5e70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
5e80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5e90: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
5ea0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5eb0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5ec0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5ed0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5ee0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5ef0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5f00: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5f10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5f20: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5f30: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5f40: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
5f50: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
5f60: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
5f70: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
5f80: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
5f90: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
5fa0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5fb0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5fc0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5fd0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5fe0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5ff0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
6000: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
6010: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
6020: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
6030: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
6040: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a  is journal..** .
6050: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
6060: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
6070: 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e   24) bytes of un
6080: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
6090: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
60a0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
60b0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72  *pPager){.  char
60c0: 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
60d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
60e0: 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  6];.  int rc;.. 
60f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
6100: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
6110: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
6120: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
6130: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a  ournalOff;.  }..
6140: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6150: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6160: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6170: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
6180: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
6190: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
61a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
61b0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
61c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
61d0: 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a  ..  /* FIX ME: .
61e0: 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62    **.  ** Possib
61f0: 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e  ly for a pager n
6200: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
6210: 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
6220: 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74  magic should not
6230: 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
6240: 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66   until nRec is f
6250: 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74  illed in as part
6260: 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75   of next syncJou
6270: 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20  rnal(). .  **.  
6280: 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62  ** Actually mayb
6290: 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  e the whole jour
62a0: 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c  nal header shoul
62b0: 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74  d be delayed unt
62c0: 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69  il that.  ** poi
62d0: 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  nt. Think about 
62e0: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  this..  */.  mem
62f0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
6300: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6310: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6320: 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65  ));.  /* The nRe
6330: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
6340: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
6350: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70  journals. */.  p
6360: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6370: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6380: 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
6390: 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
63a0: 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a  fffff : 0);.  /*
63b0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
63c0: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
63d0: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
63e0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
63f0: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
6400: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
6410: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
6420: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6430: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6440: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
6450: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6460: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
6470: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
6480: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6490: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
64a0: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
64b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
64c0: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
64d0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
64e0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
64f0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
6500: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6510: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
6520: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6530: 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ize);.  IOTRACE(
6540: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
6550: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
6560: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6570: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
6580: 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ))).  rc = sqlit
6590: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
65a0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
65b0: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
65c0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
65d0: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
65e0: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
65f0: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
6600: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
6610: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6620: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6630: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6640: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
6650: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6660: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
6670: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
6680: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
6690: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
66a0: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
66b0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
66c0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
66d0: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
66e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
66f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
6700: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6710: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  e(pPager->jfd, "
6720: 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d  \000", 1);.    }
6730: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6750: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6760: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
6770: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
6780: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
6790: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
67a0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
67b0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
67c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
67d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
67e0: 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d  * file. See comm
67f0: 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74  ents above funct
6800: 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  ion writeJournal
6810: 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63  Hdr() for a desc
6820: 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  ription of.** th
6830: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6840: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
6850: 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20  f the header is 
6860: 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c  read successfull
6870: 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20  y, *nRec is set 
6880: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
6890: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
68a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
68b0: 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69  header and *dbSi
68c0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
68d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
68e0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
68f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
6900: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
6910: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
6920: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
6930: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
6940: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6950: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
6960: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
6970: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
6980: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
6990: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
69a0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
69b0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
69c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
69d0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e   returned and *n
69e0: 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  Rec and *dbSize 
69f0: 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66  are not set.  If
6a00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
6a10: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
6a20: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
6a30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
6a40: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
6a50: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
6a60: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
6a70: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
6a80: 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a  pPager, .  i64 j
6a90: 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33  ournalSize,.  u3
6aa0: 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32  2 *pNRec, .  u32
6ab0: 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69   *pDbSize.){.  i
6ac0: 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
6ad0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
6ae0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
6af0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
6b00: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20  header */..  rc 
6b10: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6b20: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
6b30: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6b40: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6b50: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
6b60: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6b70: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
6b80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6b90: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6ba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
6bb0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
6bc0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
6bd0: 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20  aMagic));.  if( 
6be0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6bf0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
6c00: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
6c10: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
6c20: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
6c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6c40: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  E;.  }..  rc = r
6c50: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6c60: 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20  ->jfd, pNRec);. 
6c70: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6c80: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
6c90: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6ca0: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
6cb0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
6cc0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6cd0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6ce0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6cf0: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
6d00: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6d10: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
6d20: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
6d30: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
6d40: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
6d50: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
6d60: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
6d70: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
6d80: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
6d90: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
6da0: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
6db0: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
6dc0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
6dd0: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
6de0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
6df0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
6e00: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
6e10: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
6e20: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
6e30: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
6e40: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
6e50: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
6e60: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6e70: 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a  ger->jfd, (u32 *
6e80: 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  )&pPager->sector
6e90: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
6ea0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6eb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6ec0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
6ed0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6ee0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6ef0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6f00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6f10: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
6f20: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
6f30: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
6f40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6f50: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
6f60: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
6f70: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
6f80: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6f90: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
6fa0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
6fb0: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
6fc0: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
6fd0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
6fe0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
6ff0: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
7000: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
7010: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
7020: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
7030: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
7040: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
7050: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
7060: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
7070: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
7080: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
7090: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
70a0: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
70b0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
70c0: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
70d0: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
70e0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
70f0: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
7100: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
7110: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
7120: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
7130: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
7140: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
7150: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
7160: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
7170: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
7180: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
7190: 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
71a0: 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
71b0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
71c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
71d0: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
71e0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
71f0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
7200: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
7210: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
7220: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
7230: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
7240: 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a  len; .  int i; .
7250: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
7260: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
7270: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7280: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
7290: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
72a0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
72b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
72d0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
72e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
72f0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
7300: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
7310: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
7320: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
7330: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
7340: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
7350: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
7360: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
7370: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
7380: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7390: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
73a0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
73b0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
73c0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
73d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
73e0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
73f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
7400: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
7410: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
7420: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
7430: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
7450: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7460: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
7470: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
7480: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7490: 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  d, PAGER_MJ_PGNO
74a0: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
74b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
74d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
74e0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
74f0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
7500: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7510: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7520: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
7530: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
7540: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
7550: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
7560: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
7570: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7580: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7590: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
75a0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
75b0: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
75c0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
75d0: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  ));.  pPager->ne
75e0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
75f0: 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75  ->noSync;.  retu
7600: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7610: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
7620: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
7630: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
7640: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
7650: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
7660: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
7670: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
7680: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
7690: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
76a0: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
76b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
76c0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
76d0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
76e0: 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a  rStmtCommit().**
76f0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43   routine run MUC
7700: 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  H faster for the
7710: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
7720: 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e  re there are man
7730: 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65  y.** pages in me
7740: 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20  mory but only a 
7750: 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73  few are in the s
7760: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7780: 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
7790: 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50  t_list(PgHdr *pP
77a0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
77b0: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
77c0: 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  r;.  if( pPg->in
77d0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
77e0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
77f0: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50  revStmt==0 && pP
7800: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20  g->pNextStmt==0 
7810: 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  );.  pPg->pPrevS
7820: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  tmt = 0;.  if( p
7830: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
7840: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
7850: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
7860: 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
7870: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
7880: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67  r->pStmt;.  pPag
7890: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b  er->pStmt = pPg;
78a0: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
78b0: 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69   1;.}.static voi
78c0: 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72  d page_remove_fr
78d0: 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  om_stmt_list(PgH
78e0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
78f0: 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72  !pPg->inStmt ) r
7900: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
7910: 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20  ->pPrevStmt ){. 
7920: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
7930: 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74  pPrevStmt->pNext
7940: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
7950: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d   pPg->pPrevStmt-
7960: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67  >pNextStmt = pPg
7970: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7980: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
7990: 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ( pPg->pPager->p
79a0: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
79b0: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
79c0: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
79d0: 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Stmt;.  }.  if( 
79e0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29  pPg->pNextStmt )
79f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7a00: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50  g->pNextStmt->pP
7a10: 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  revStmt==pPg );.
7a20: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74      pPg->pNextSt
7a30: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
7a40: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a  pPg->pPrevStmt;.
7a50: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
7a60: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d  Stmt = 0;.  pPg-
7a70: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7a80: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
7a90: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
7aa0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
7ab0: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
7ac0: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
7ad0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
7ae0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
7af0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
7b00: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
7b10: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
7b20: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
7b30: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
7b40: 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
7b50: 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
7b60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7b70: 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48    p = pPager->aH
7b80: 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67  ash[pgno & (pPag
7b90: 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20  er->nHash-1)];. 
7ba0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
7bb0: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
7bc0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
7bd0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
7be0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
7bf0: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
7c00: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
7c10: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
7c20: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
7c30: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
7c40: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
7c50: 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  ){.    if( !MEMD
7c60: 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
7c70: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
7c80: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
7c90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
7ca0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
7cb0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
7cc0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
7cd0: 29 29 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  )).    }.    pPa
7ce0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
7cf0: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70  ER_UNLOCK;.    p
7d00: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
7d10: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ntDone = 0;.  }.
7d20: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
7d30: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
7d40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
7d50: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
7d60: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
7d70: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  se file. This is
7d80: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
7d90: 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
7da0: 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65  y entered.** the
7db0: 20 65 72 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f   error-state..*/
7dc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7dd0: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
7de0: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
7df0: 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 20   if( p->errCode 
7e00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7e10: 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
7e20: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
7e30: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  p->journalOpen==
7e40: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74  0 );.  if( p->st
7e50: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7e60: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7e70: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
7e80: 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  p);.  }.  pager_
7e90: 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73  unlock(p);.  ass
7ea0: 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20  ert( p->errCode 
7eb0: 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  || !p->journalOp
7ec0: 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73  en || (p->exclus
7ed0: 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75  iveMode&&!p->jou
7ee0: 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73  rnalOff) );.  as
7ef0: 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64 65  sert( p->errCode
7f00: 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e   || !p->stmtOpen
7f10: 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65   || p->exclusive
7f20: 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  Mode );.}.../*.*
7f30: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
7f40: 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20  abase and clear 
7f50: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
7f60: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
7f70: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
7f80: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
7f90: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
7fa0: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
7fb0: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
7fc0: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
7fd0: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
7fe0: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
7ff0: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
8000: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
8010: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
8020: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
8030: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
8040: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8050: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
8060: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8070: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
8080: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
8090: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
80a0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
80b0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
80c0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
80d0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
80e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
80f0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
8100: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
8110: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8120: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8130: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
8140: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
8150: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
8160: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  >pAll = 0;.  pPa
8170: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
8180: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
8190: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
81a0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
81b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
81c0: 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  h = 0;.  pPager-
81d0: 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nRef = 0;.}../*
81e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
81f0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
8200: 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74  ion.  A transact
8210: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20  ion is ended by 
8220: 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d  either.** a COMM
8230: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
8240: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
8250: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8260: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
8270: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
8280: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
8290: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
82a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
82b0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
82c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
82d0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20   release.** the 
82e0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
82f0: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
8300: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
8310: 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73  place if that is
8320: 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
8330: 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e  ate thing to do.
8340: 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20    Release locks 
8350: 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f  usually is appro
8360: 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73  priate,.** unles
8370: 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  s we are in excl
8380: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
8390: 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73  e or unless this
83a0: 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54   is a .** COMMIT
83b0: 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f   AND BEGIN or RO
83c0: 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e  LLBACK AND BEGIN
83d0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
83e0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
83f0: 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c  le is either del
8400: 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65  eted or truncate
8410: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
8420: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
8430: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8440: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
8450: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
8460: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
8470: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
8480: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
8490: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
84a0: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
84b0: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
84c0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
84d0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
84e0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
84f0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
8500: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
8510: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8520: 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  ;.  int rc2 = SQ
8530: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
8540: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
8550: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
8560: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
8570: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8580: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
8590: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
85a0: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
85b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
85c0: 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72  tOpen && !pPager
85d0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
85e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
85f0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
8600: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
8610: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
8620: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
8630: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
8640: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8650: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
8660: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63            && (rc
8670: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
8680: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
8690: 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , 0))==SQLITE_OK
86a0: 20 29 7b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   ){;.      sqlit
86b0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
86c0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
86d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
86e0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
86f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
8700: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
8710: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
8720: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
8730: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70  r->jfd);.      p
8740: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
8750: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  en = 0;.      if
8760: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8770: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8780: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
8790: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
87a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
87b0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
87c0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
87d0: 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
87e0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
87f0: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
8800: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
8810: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
8820: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
8830: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
8840: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
8850: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
8860: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
8870: 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73       pPg->always
8880: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69  Rollback = 0;.#i
8890: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
88a0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
88b0: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
88c0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
88d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
88e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
88f0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
8900: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
8910: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
8920: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
8930: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
8940: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
8950: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
8960: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
8970: 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
8980: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
8990: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  =0 );.  }..  if(
89a0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
89b0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
89c0: 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  c2 = sqlite3OsUn
89d0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
89e0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
89f0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
8a00: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
8a10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
8a20: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
8a30: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
8a40: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
8a50: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
8a60: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
8a70: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
8a80: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
8a90: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
8aa0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8ab0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8ac0: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
8ad0: 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65  >pFirst;.  pPage
8ae0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
8af0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
8b00: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
8b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
8b20: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
8b30: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
8b40: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
8b50: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
8b60: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
8b70: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
8b80: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
8b90: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
8ba0: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
8bb0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8bc0: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
8bd0: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
8be0: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
8bf0: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
8c00: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
8c10: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
8c20: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
8c30: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
8c40: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
8c50: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
8c60: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
8c70: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
8c80: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
8c90: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
8ca0: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
8cb0: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
8cc0: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
8cd0: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
8ce0: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
8cf0: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
8d00: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
8d10: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
8d20: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
8d30: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
8d40: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
8d50: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
8d60: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
8d70: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
8d80: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
8d90: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
8da0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
8db0: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
8dc0: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
8dd0: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
8de0: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
8df0: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
8e00: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
8e10: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
8e20: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
8e30: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
8e40: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
8e50: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
8e60: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
8e70: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
8e80: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
8e90: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
8ea0: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
8eb0: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
8ec0: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
8ed0: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
8ee0: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
8ef0: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
8f00: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
8f10: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
8f20: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
8f30: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
8f40: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
8f50: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
8f60: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
8f70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
8f80: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
8f90: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
8fa0: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
8fb0: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
8fc0: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
8fd0: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
8fe0: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
8ff0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
9000: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
9010: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
9020: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
9030: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
9040: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
9050: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
9060: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
9070: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
9080: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
9090: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
90a0: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
90b0: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
90c0: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
90d0: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
90e0: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
90f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9100: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
9110: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
9120: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
9130: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
9140: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
9150: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
9160: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
9170: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
9180: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75  File *jfd, int u
9190: 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  seCksum){.  int 
91a0: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
91b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91c0: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
91d0: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
91e0: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
91f0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
9200: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
9210: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
9220: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
9230: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
9260: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
9270: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
9280: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  *aData = (u8 *)p
9290: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
92a0: 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ;   /* Temp stor
92b0: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
92c0: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
92d0: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
92e0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
92f0: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
9300: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
9310: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
9320: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
9330: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
9340: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
9350: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
9360: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
9370: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
9380: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
9390: 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  a );..  rc = rea
93a0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
93b0: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
93c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
93d0: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
93e0: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
93f0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
9400: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
9410: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9420: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
9430: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9440: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
9450: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
9460: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
9470: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
9480: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
9490: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
94a0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
94b0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
94c0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
94d0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
94e0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
94f0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
9500: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
9510: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
9520: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
9530: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
9540: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
9550: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
9560: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
9570: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
9580: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
9590: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
95a0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
95b0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
95c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
95d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
95e0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
95f0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
9600: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9610: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
9620: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
9630: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9640: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
9650: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9660: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
9670: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
9680: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
9690: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
96a0: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
96b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
96c0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
96d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
96e0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
96f0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
9700: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9710: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
9720: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
9730: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
9740: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
9750: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
9760: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
9770: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
9780: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
9790: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
97a0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
97b0: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
97c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
97d0: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
97e0: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
97f0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
9800: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
9810: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
9820: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
9830: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
9840: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
9850: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
9860: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
9870: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
9880: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
9890: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
98a0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
98b0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
98c0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
98d0: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
98e0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
98f0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
9900: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
9910: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
9920: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
9930: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
9940: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
9950: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
9960: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
9970: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
9980: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
9990: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
99a0: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
99b0: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
99c0: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
99d0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
99e0: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
99f0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
9a00: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
9a10: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
9a20: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
9a30: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
9a40: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
9a50: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
9a60: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
9a70: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
9a80: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
9a90: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
9aa0: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
9ab0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
9ac0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
9ad0: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
9ae0: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
9af0: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
9b00: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
9b10: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
9b20: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
9b30: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
9b40: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9b50: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
9b60: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
9b70: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
9b80: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
9b90: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
9ba0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
9bb0: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
9bc0: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
9bd0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
9be0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
9bf0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
9c00: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
9c10: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
9c20: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
9c30: 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 50 41  | pPg!=0 );.  PA
9c40: 47 45 52 54 52 41 43 45 33 28 22 50 4c 41 59 42  GERTRACE3("PLAYB
9c50: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ACK %d page %d\n
9c60: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
9c70: 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  r), pgno);.  if(
9c80: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9c90: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9ca0: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50  && (pPg==0 || pP
9cb0: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20  g->needSync==0) 
9cc0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9cd0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
9ce0: 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28  ->fd, (pgno-1)*(
9cf0: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
9d00: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
9d10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9d20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9d30: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9d40: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
9d50: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9d60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
9d70: 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43  g ){.      makeC
9d80: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
9d90: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
9da0: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
9db0: 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
9dc0: 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
9dd0: 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
9de0: 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
9df0: 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
9e00: 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
9e10: 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
9e20: 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
9e30: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
9e40: 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
9e50: 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
9e60: 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
9e70: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
9e80: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
9e90: 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
9ea0: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
9eb0: 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
9ec0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
9ed0: 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
9ee0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
9ef0: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
9f00: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
9f10: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
9f20: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
9f30: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
9f40: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
9f50: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
9f60: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9f70: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
9f80: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
9f90: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
9fa0: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
9fb0: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
9fc0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
9fd0: 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50  structor(pPg, pP
9fe0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9ff0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
a000: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
a010: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
a020: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
a030: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
a040: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
a050: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
a060: 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20 20 20 20 2f  pgno, 3);..    /
a070: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
a080: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
a090: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
a0a0: 50 61 67 65 72 2e 69 43 68 61 6e 67 65 43 6f 75  Pager.iChangeCou
a0b0: 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  nt */.    if( pg
a0c0: 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  no==1 ){.      p
a0d0: 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
a0e0: 75 6e 74 20 3d 20 72 65 74 72 69 65 76 65 33 32  unt = retrieve32
a0f0: 62 69 74 73 28 70 50 67 2c 20 32 34 29 3b 0a 20  bits(pPg, 24);. 
a100: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a110: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
a120: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
a130: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
a140: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a150: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
a160: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
a170: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
a180: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a190: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
a1a0: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
a1b0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
a1c0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
a1d0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
a1e0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a1f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
a200: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
a210: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
a220: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a230: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
a240: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
a250: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
a260: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
a270: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a280: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
a290: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
a2a0: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
a2b0: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
a2c0: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
a2d0: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
a2e0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
a2f0: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
a300: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
a310: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
a320: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
a330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a340: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
a350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
a360: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
a370: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
a380: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
a390: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
a3a0: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
a3b0: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
a3c0: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
a3d0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
a3e0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
a3f0: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
a400: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
a410: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
a420: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
a430: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
a440: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
a450: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
a460: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
a470: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
a480: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
a490: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
a4a0: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
a4b0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
a4c0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
a4d0: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
a4e0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
a4f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
a500: 6d 61 73 74 65 72 20 29 3b 0a 20 20 69 66 28 20  master );.  if( 
a510: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a520: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a530: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
a540: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
a550: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
a560: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
a570: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
a580: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a590: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a5a0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
a5b0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
a5c0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
a5d0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
a5e0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
a5f0: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
a600: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
a610: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
a620: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
a630: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
a640: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
a650: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
a660: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
a670: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
a680: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
a690: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
a6a0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a6b0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
a6c0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
a6d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
a6e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
a6f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
a700: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a710: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
a720: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
a730: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
a740: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
a750: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a760: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
a770: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
a780: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
a790: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
a7a0: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
a7b0: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
a7c0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
a7d0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
a7e0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
a7f0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
a810: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
a820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
a830: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
a840: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
a850: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
a860: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
a870: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
a880: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
a890: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
a8a0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
a8b0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
a8c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
a8d0: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
a8e0: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
a8f0: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
a900: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
a910: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
a920: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
a930: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
a940: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72  QLITE_OK || jour
a950: 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  nal );.        i
a960: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
a980: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a990: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
a9a0: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
a9b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
a9c0: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
a9d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a9e0: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
a9f0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
aa00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
aa10: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
aa20: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
aa30: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
aa40: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
aa50: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
aa60: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
aa70: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
aa80: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
aa90: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
aaa0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
aab0: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
aac0: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
aad0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
aae0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
aaf0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ab00: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
ab10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ab20: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
ab30: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
ab40: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
ab50: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
ab60: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
ab70: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
ab80: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
ab90: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
aba0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
abb0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
abc0: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
abd0: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
abe0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
abf0: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
ac00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 30  urn rc;.}..#if 0
ac10: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72  ./*.** Make ever
ac20: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  y page in the ca
ac30: 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77  che agree with w
ac40: 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20  hat is on disk. 
ac50: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
ac60: 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64  .** reread the d
ac70: 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65  isk to reset the
ac80: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61   state of the ca
ac90: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
aca0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
acb0: 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  d after a rollba
acc0: 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65  ck in which some
acd0: 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61   of the dirty ca
ace0: 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64  che.** pages had
acf0: 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
ad00: 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e  ten out to disk.
ad10: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
ad20: 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61  l back the.** ca
ad30: 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  che content and 
ad40: 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  the easiest way 
ad50: 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f  to do that is to
ad60: 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20   reread the old 
ad70: 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20  content.** back 
ad80: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a  from the disk..*
ad90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
ada0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
adb0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
adc0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
add0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ade0: 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  OK;.  for(pPg=pP
adf0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
ae00: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
ae10: 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ll){.    char *z
ae20: 42 75 66 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Buf = pPager->pT
ae30: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
ae40: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
ae50: 66 6f 72 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a  for one page */.
ae60: 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69      if( !pPg->di
ae70: 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rty ) continue;.
ae80: 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
ae90: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
aea0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
aeb0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
aec0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
aed0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
aee0: 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d  eSize*(i64)(pPg-
aef0: 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20  >pgno-1));.     
af00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
af10: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
af20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
af30: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
af40: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
af50: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
af60: 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
af70: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
af80: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
af90: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
afa0: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
afb0: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
afc0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
afd0: 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  zBuf, pPg->pgno,
afe0: 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   2);.    }else{.
aff0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
b000: 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  f, 0, pPager->pa
b010: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
b020: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
b030: 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42  ==0 || memcmp(zB
b040: 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  uf, PGHDR_TO_DAT
b050: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
b060: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
b070: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
b080: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
b090: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
b0a0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
b0b0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
b0c0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
b0d0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
b0e0: 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
b0f0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65  eSize);.      }e
b100: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
b110: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
b120: 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
b130: 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
b140: 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ra);.      }.   
b150: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64   }.    pPg->need
b160: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
b170: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69  g->dirty = 0;.#i
b180: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
b190: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
b1a0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
b1b0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
b1c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 50  .#endif.  }.  pP
b1d0: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
b1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b1f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
b200: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
b210: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
b220: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
b230: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
b240: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  ** indicated..*/
b250: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b260: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
b270: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
b280: 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
b290: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
b2a0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
b2b0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
b2c0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b2d0: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
b2e0: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
b2f0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
b300: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
b310: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
b320: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
b330: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
b340: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
b350: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
b360: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
b370: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
b380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
b390: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
b3a0: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
b3b0: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
b3c0: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
b3d0: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
b3e0: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
b3f0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
b400: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
b410: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
b420: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
b430: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
b440: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
b450: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
b460: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
b470: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
b480: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
b490: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b4a0: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
b4b0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b4c0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b4d0: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
b4e0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
b4f0: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
b500: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
b510: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
b520: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
b530: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
b540: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
b550: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
b560: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
b570: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
b580: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
b590: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b5a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
b5b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
b5c0: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
b5d0: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
b5e0: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
b5f0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
b600: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
b610: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
b620: 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  6)  N bytes of t
b630: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b640: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
b650: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
b660: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
b670: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
b680: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
b690: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
b6a0: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
b6b0: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
b6c0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
b6d0: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
b6e0: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
b6f0: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
b700: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
b710: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
b720: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
b730: 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (7)  Zero or mor
b740: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
b750: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
b760: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
b770: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
b780: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
b790: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
b7a0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
b7b0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
b7c0: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
b7d0: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
b7e0: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
b7f0: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
b800: 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74  n the first 6 it
b810: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
b820: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
b830: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
b840: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74  stance of the 7t
b850: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
b860: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
b870: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
b880: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
b890: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
b8a0: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
b8b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
b8c0: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
b8d0: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
b8e0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
b8f0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
b900: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
b910: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b920: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
b930: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
b940: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
b950: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
b960: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
b970: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
b980: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
b990: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b9a0: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
b9b0: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
b9c0: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
b9d0: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
b9e0: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
b9f0: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
ba00: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
ba10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
ba20: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
ba30: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
ba40: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
ba50: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
ba60: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
ba70: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
ba80: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
ba90: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
baa0: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
bab0: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
bac0: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
bad0: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
bae0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
baf0: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
bb00: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
bb10: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
bb20: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
bb30: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
bb40: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
bb50: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
bb60: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
bb70: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
bb80: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
bb90: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
bba0: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
bbb0: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
bbc0: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
bbd0: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
bbe0: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
bbf0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
bc00: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
bc10: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
bc20: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
bc30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
bc40: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
bc50: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
bc60: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
bc70: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
bc80: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
bc90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
bca0: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
bcb0: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
bcc0: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
bcd0: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
bce0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
bcf0: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
bd00: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
bd10: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
bd20: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
bd30: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
bd40: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
bd50: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
bd60: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
bd70: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
bd80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
bd90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bda0: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
bdb0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
bdc0: 6f 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  ot){.  i64 szJ; 
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
bdf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
be00: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
be10: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
be20: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
be30: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
be40: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
be50: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
be60: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
be70: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
be80: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
be90: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
bea0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
beb0: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
bec0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
bed0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
bee0: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
bef0: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
bf00: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
bf10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
bf20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
bf30: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
bf40: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
bf50: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
bf60: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
bf70: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
bf80: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
bf90: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
bfa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
bfb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
bfc0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
bfd0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
bfe0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
bff0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c000: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
c010: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
c020: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
c030: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
c040: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
c050: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
c060: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
c070: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
c080: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c090: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
c0a0: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
c0b0: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
c0c0: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
c0d0: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
c0e0: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
c0f0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
c100: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
c110: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
c120: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
c130: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
c140: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
c150: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
c160: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
c170: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
c180: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
c190: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
c1a0: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
c1b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
c1c0: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
c1d0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
c1e0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
c1f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c200: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
c210: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
c220: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
c230: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
c240: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c250: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
c260: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
c270: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
c280: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
c290: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
c2a0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
c2b0: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
c2c0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
c2d0: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
c2e0: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
c2f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
c300: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
c310: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
c320: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
c330: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
c340: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
c350: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
c360: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
c370: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
c380: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
c390: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
c3a0: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
c3b0: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
c3c0: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
c3d0: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
c3e0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
c3f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
c400: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
c410: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
c420: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
c430: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c440: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
c450: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
c460: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c470: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c480: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
c490: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c4a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
c4b0: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
c4c0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
c4d0: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
c4e0: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
c4f0: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
c500: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
c510: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
c520: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
c530: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
c540: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
c550: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
c560: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
c570: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
c580: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
c590: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
c5a0: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
c5b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c5c0: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
c5d0: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
c5e0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
c5f0: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
c600: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
c610: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
c620: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
c630: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
c640: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
c650: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
c660: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
c670: 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
c680: 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
c690: 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
c6a0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
c6b0: 65 73 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ess. In this cas
c6c0: 65 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  e the rest of th
c6d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
c6e0: 6f 6e 73 69 73 74 73 20 6f 66 0a 20 20 20 20 2a  onsists of.    *
c6f0: 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70  * journalled cop
c700: 69 65 73 20 6f 66 20 70 61 67 65 73 20 74 68 61  ies of pages tha
c710: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 61  t need to be rea
c720: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
c730: 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
c740: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
c750: 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20   !isHot ){.     
c760: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
c770: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c780: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
c790: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
c7a0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
c7b0: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
c7c0: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
c7d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
c7e0: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
c7f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
c800: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
c810: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
c820: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c830: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
c840: 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20  XCLUSIVE && .   
c850: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c860: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
c870: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c880: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c890: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
c8a0: 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ize==0 || pPager
c8b0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78  ->origDbSize==mx
c8c0: 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg );.      rc =
c8d0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
c8e0: 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
c8f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c900: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c910: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
c920: 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
c930: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
c940: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
c950: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
c960: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
c970: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
c980: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
c990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
c9a0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
c9b0: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
c9c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
c9d0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
c9e0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
c9f0: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
ca00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ca10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ca20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ca30: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
ca40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
ca50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
ca60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ca70: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
ca80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ca90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
caa0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
cab0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
cac0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
cad0: 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
cae0: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
caf0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
cb00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
cb10: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
cb20: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
cb30: 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
cb40: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
cb50: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
cb60: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
cb70: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
cb80: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
cb90: 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
cba0: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
cbb0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
cbc0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
cbd0: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
cbe0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cbf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
cc00: 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
cc10: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
cc20: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
cc30: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
cc40: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
cc50: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
cc60: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
cc70: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
cc80: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
cc90: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
cca0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
ccb0: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
ccc0: 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
ccd0: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
cce0: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
ccf0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
cd00: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
cd10: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
cd20: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
cd30: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
cd40: 2d 3e 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->fd);.  return 
cd50: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
cd60: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
cd70: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
cd80: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
cd90: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
cda0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
cdb0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
cdc0: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
cdd0: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
cde0: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
cdf0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
ce00: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ce10: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
ce20: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
ce30: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
ce40: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
ce50: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
ce60: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ce70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
ce80: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
ce90: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
cea0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
ceb0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
cec0: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
ced0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
cee0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
cef0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
cf00: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
cf10: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
cf20: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
cf30: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
cf40: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
cf50: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
cf60: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
cf70: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
cf80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
cf90: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
cfa0: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
cfb0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
cfc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cfd0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
cfe0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d000: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
d010: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
d020: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
d030: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
d040: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
d050: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
d060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
d070: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
d080: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
d090: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d0a0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
d0b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
d0c0: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
d0d0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
d0e0: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
d0f0: 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
d100: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
d110: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
d120: 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
d130: 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
d140: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
d150: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
d160: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
d170: 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
d180: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
d190: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
d1a0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
d1b0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
d1c0: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
d1d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
d1e0: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
d1f0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
d200: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
d210: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
d220: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
d230: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
d240: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
d250: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
d260: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
d270: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
d280: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
d290: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
d2a0: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
d2b0: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
d2c0: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
d2d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
d2e0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
d2f0: 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 70 50 61  _SHARED );.  pPa
d300: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
d310: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a  ager->stmtSize;.
d320: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
d330: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
d340: 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  s are in the sta
d350: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
d360: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d370: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
d380: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
d390: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
d3a0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
d3b0: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e  r->stfd, 0);.  n
d3c0: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
d3d0: 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
d3e0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
d3f0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
d400: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d410: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
d420: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d430: 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
d440: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
d450: 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
d460: 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
d470: 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
d480: 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
d490: 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
d4a0: 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
d4b0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
d4c0: 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
d4d0: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
d4e0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
d4f0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
d500: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
d510: 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
d520: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
d530: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d540: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d550: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d560: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d570: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  k;.  }..  /* Now
d580: 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73   roll some pages
d590: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74   back from the t
d5a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
d5b0: 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53  al. Pager.stmtJS
d5c0: 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65  ize.  ** was the
d5d0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
d5e0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74  rnal file when t
d5f0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61  his statement wa
d600: 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20  s started, so.  
d610: 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66  ** everything af
d620: 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74  ter that needs t
d630: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
d640: 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  , either into th
d650: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
d660: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68   the memory cach
d670: 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  e, or both..  **
d680: 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  .  ** If it is n
d690: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61  ot zero, then Pa
d6a0: 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69  ger.stmtHdrOff i
d6b0: 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  s the offset to 
d6c0: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
d6d0: 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  f the first jour
d6e0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
d6f0: 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73  en during this s
d700: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
d710: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
d720: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
d730: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
d740: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
d750: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d760: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
d770: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d780: 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
d790: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
d7a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
d7b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  ;.  pPager->cksu
d7c0: 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  mInit = pPager->
d7d0: 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69  stmtCksum;.  whi
d7e0: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
d7f0: 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20  nalOff < hdrOff 
d800: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
d810: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
d820: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
d830: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
d840: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d850: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d860: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d870: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d880: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
d890: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
d8a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
d8b0: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a  zJ ){.    u32 nJ
d8c0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
d8d0: 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
d8e0: 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
d8f0: 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
d900: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
d910: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
d920: 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
d930: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d940: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d950: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d960: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d970: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
d980: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
d990: 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
d9a0: 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
d9b0: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
d9c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
d9d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d9e0: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
d9f0: 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e  or(i=nJRec-1; i>
da00: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
da10: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
da20: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
da30: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
da40: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
da50: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
da60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
da70: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
da80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
da90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
daa0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
dab0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
dac0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
dad0: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
dae0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
daf0: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
db00: 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61  TE_OK) {.    pPa
db10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
db20: 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
db30: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
db40: 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
db50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
db60: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
db70: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
db80: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
db90: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
dba0: 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
dbb0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
dbc0: 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
dbd0: 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
dbe0: 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
dbf0: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
dc00: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
dc10: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
dc20: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
dc30: 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
dc40: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
dc50: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
dc60: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
dc70: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
dc80: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
dc90: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
dca0: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
dcb0: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
dcc0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
dcd0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
dce0: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
dcf0: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
dd00: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
dd10: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
dd20: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
dd30: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
dd40: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
dd50: 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
dd60: 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
dd70: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
dd80: 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
dd90: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
dda0: 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
ddb0: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
ddc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ddd0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
dde0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
ddf0: 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
de00: 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
de10: 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
de20: 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
de30: 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
de40: 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
de50: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
de60: 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
de70: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
de80: 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
de90: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
dea0: 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
deb0: 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
dec0: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
ded0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
dee0: 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
def0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
df00: 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
df10: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
df20: 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
df30: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
df40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
df50: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
df60: 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
df70: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
df80: 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
df90: 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
dfa0: 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
dfb0: 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
dfc0: 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
dfd0: 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
dff0: 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
e000: 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
e010: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
e020: 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
e030: 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
e040: 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
e050: 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
e060: 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
e070: 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
e080: 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
e090: 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
e0a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e0b0: 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
e0c0: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
e0d0: 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
e0e0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
e0f0: 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
e100: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
e110: 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
e120: 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
e130: 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
e140: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
e150: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
e160: 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
e170: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
e180: 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
e190: 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
e1a0: 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a  nt full_fsync){.
e1b0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
e1c0: 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
e1d0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e1e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
e1f0: 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
e200: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
e210: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
e220: 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c  full_fsync = ful
e230: 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70  l_fsync;.  if( p
e240: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
e250: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
e260: 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
e270: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
e280: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
e290: 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
e2a0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
e2b0: 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
e2c0: 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
e2d0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
e2e0: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
e2f0: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
e300: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
e310: 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
e320: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
e330: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
e340: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
e350: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
e360: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
e370: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72   file. .**.** Wr
e380: 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
e390: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
e3a0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
e3b0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
e3c0: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
e3d0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
e3e0: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
e3f0: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
e400: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
e410: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
e420: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
e430: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
e440: 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65   int sqlite3Page
e450: 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65  rOpentemp(OsFile
e460: 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63   **pFd){.  int c
e470: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
e480: 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53  ;.  char zFile[S
e490: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
e4a0: 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51  IZE];..#ifdef SQ
e4b0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
e4c0: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
e4d0: 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
e4e0: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
e4f0: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
e500: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20  #endif.  do{.   
e510: 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69   cnt--;.    sqli
e520: 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
e530: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
e540: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
e550: 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c  Exclusive(zFile,
e560: 20 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61 73   pFd, 1);.    as
e570: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e580: 5f 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20  _OK || *pFd );. 
e590: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
e5a0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
e5b0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
e5c0: 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
e5d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
e5e0: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
e5f0: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
e600: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
e610: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
e620: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
e630: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
e640: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
e650: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
e660: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
e670: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
e680: 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
e690: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
e6a0: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
e6b0: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
e6c0: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
e6d0: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ng sqlite3PagerU
e6e0: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
e6f0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
e700: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
e710: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
e720: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
e730: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
e740: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
e750: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
e760: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
e770: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
e780: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
e790: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
e7a0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
e7b0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
e7c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
e7d0: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
e7e0: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
e7f0: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
e800: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
e810: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
e820: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
e830: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
e840: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
e850: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
e860: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
e870: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
e880: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
e890: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
e8a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
e8b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
e8c0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
e8d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
e8e0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
e8f0: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
e900: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
e910: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
e920: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
e930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
e940: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
e950: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  this file */.){.
e960: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
e970: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  = 0;.  char *zFu
e980: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a  llPathname = 0;.
e990: 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20    int nameLen;  
e9a0: 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77  /* Compiler is w
e9b0: 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c  rong. This is al
e9c0: 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
e9d0: 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20   before use */. 
e9e0: 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b   OsFile *fd = 0;
e9f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ea00: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
ea10: 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
ea20: 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
ea30: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
ea40: 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
ea50: 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
ea60: 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
ea70: 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
ea80: 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
ea90: 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
eaa0: 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
eab0: 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
eac0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
ead0: 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  E];.#ifdef SQLIT
eae0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
eaf0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
eb00: 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f  A malloc() canno
eb10: 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65  t fail in sqlite
eb20: 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73  3ThreadData() as
eb30: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c   one or more cal
eb40: 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c  ls to .  ** mall
eb50: 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61  oc() must have a
eb60: 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65  lready been made
eb70: 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20   by this thread 
eb80: 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20  before it gets. 
eb90: 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e   ** to this poin
eba0: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  t. This means th
ebb0: 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73  e ThreadData mus
ebc0: 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f  t have been allo
ebd0: 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20  cated already.  
ebe0: 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61  ** so that Threa
ebf0: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e  dData.nAlloc can
ec00: 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c   be set. It woul
ec10: 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73  d be nice to ass
ec20: 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68  ert.  ** that Th
ec30: 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
ec40: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74  is non-zero, but
ec50: 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b   alas this break
ec60: 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20  s test cases .  
ec70: 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e  ** written to in
ec80: 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64  voke the pager d
ec90: 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  irectly..  */.  
eca0: 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
ecb0: 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64   = sqlite3Thread
ecc0: 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74  Data();.  assert
ecd0: 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66  ( pTsd );.#endif
ece0: 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74  ..  /* We used t
ecf0: 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63  o test if malloc
ed00: 28 29 20 68 61 64 20 61 6c 72 65 61 64 79 20 66  () had already f
ed10: 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f  ailed before pro
ed20: 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42  ceeding. .  ** B
ed30: 75 74 20 74 68 65 20 77 61 79 20 74 68 69 73 20  ut the way this 
ed40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
ed50: 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73   in SQLite means
ed60: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a   that can never.
ed70: 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72    ** happen. Fur
ed80: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65  thermore, if the
ed90: 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
eda0: 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79 20 73  lag is already s
edb0: 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  et, .  ** either
edc0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
edd0: 69 74 65 53 74 72 44 75 70 28 29 20 6f 72 20 73  iteStrDup() or s
ede0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65  qliteMalloc() be
edf0: 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61  low will.  ** fa
ee00: 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53  il shortly and S
ee10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75  QLITE_NOMEM retu
ee20: 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a  rned anyway..  *
ee30: 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
ee40: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
ee50: 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
ee60: 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
ee70: 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
ee80: 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
ee90: 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
eea0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
eeb0: 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
eec0: 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
eed0: 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
eee0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
eef0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
ef00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef10: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
ef20: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
ef30: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
ef40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
ef50: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
ef60: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
ef70: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
ef80: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
ef90: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
efa0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
efb0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
efc0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
efd0: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
efe0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
eff0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f000: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
f010: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
f020: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
f030: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
f040: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66  !=SQLITE_OK || f
f050: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
f060: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
f070: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f080: 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a  rOpentemp(&fd);.
f090: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d      sqlite3OsTem
f0a0: 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29  pFileName(zTemp)
f0b0: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
f0c0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75  = zTemp;.    zFu
f0d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
f0e0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
f0f0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
f100: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65  E_OK ){.      te
f120: 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
f130: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
f140: 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73  cate the Pager s
f150: 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72  tructure. As par
f160: 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c  t of the same al
f170: 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61  location, alloca
f180: 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  te.  ** space fo
f190: 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73  r the full paths
f1a0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69   of the file, di
f1b0: 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72  rectory and jour
f1c0: 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72  nal .  ** (Pager
f1d0: 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65  .zFilename, Page
f1e0: 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64  r.zDirectory and
f1f0: 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29   Pager.zJournal)
f200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75  ..  */.  if( zFu
f210: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
f220: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
f230: 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
f240: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
f250: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
f260: 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
f270: 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29  nameLen*3 + 30 )
f280: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
f290: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
f2a0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
f2b0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28  r->pTmpSpace = (
f2c0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
f2d0: 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45  locRaw(SQLITE_DE
f2e0: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
f2f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
f300: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
f310: 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
f320: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
f330: 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d  bove, free the m
f340: 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e  emory .  ** poin
f350: 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50  ted to by zFullP
f360: 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68  athname, free th
f370: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
f380: 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
f390: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63  .  ** file. Sinc
f3a0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
f3b0: 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
f3c0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
f3d0: 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
f3e0: 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
f3f0: 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
f400: 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a  f( !pPager || !z
f410: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20  FullPathname || 
f420: 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
f430: 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  ce || rc!=SQLITE
f440: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
f450: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
f460: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
f470: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f480: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
f490: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
f4a0: 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
f4b0: 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
f4c0: 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  rc);.  }..  PAGE
f4d0: 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
f4e0: 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
f4f0: 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
f500: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52  athname);.  IOTR
f510: 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
f520: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75  \n", pPager, zFu
f530: 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70  llPathname)).  p
f540: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f550: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
f560: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
f570: 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
f580: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
f590: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
f5a0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
f5b0: 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
f5c0: 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
f5d0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
f5e0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
f5f0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
f600: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  trcpy(pPager->zD
f610: 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50  irectory, zFullP
f620: 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72  athname);..  for
f630: 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20  (i=nameLen; i>0 
f640: 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
f650: 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
f660: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
f670: 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
f680: 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
f690: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
f6a0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c  ->zJournal, zFul
f6b0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71  lPathname);.  sq
f6c0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f6d0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
f6e0: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
f6f0: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
f700: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
f710: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
f720: 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
f730: 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
f740: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
f750: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
f760: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
f770: 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
f780: 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
f790: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f7a0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
f7b0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f7c0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
f7d0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f7e0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
f7f0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
f800: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
f810: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f820: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
f830: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
f840: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
f850: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f860: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
f870: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f880: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
f890: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f8a0: 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20  ->nMaxPage = 0; 
f8b0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
f8c0: 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73  age = 100;.  ass
f8d0: 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ert( PAGER_UNLOC
f8e0: 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61  K==0 );.  /* pPa
f8f0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
f900: 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
f910: 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
f920: 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
f930: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
f940: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
f950: 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
f960: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
f970: 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
f980: 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
f990: 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
f9a0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
f9b0: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
f9c0: 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
f9d0: 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
f9e0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
f9f0: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
fa00: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
fa10: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
fa20: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
fa30: 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
fa40: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
fa50: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
fa60: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
fa70: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
fa80: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
fa90: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
faa0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
fab0: 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  1);.  /* pPager-
fac0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
fad0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
fae0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
faf0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
fb00: 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
fb10: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
fb20: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
fb30: 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
fb40: 74 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20  t(fd||memDb);.  
fb50: 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20  if( !memDb ){.  
fb60: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
fb70: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
fb80: 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a  SectorSize(fd);.
fb90: 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
fba0: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
fbb0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
fbc0: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
fbd0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
fbe0: 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
fbf0: 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
fc00: 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
fc10: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
fc20: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61  MANAGEMENT.  pPa
fc30: 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73  ger->pNext = pTs
fc40: 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73  d->pPager;.  pTs
fc50: 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  d->pPager = pPag
fc60: 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  er;.#endif.  ret
fc70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fc80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fc90: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
fca0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
fcb0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
fcc0: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
fcd0: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
fce0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
fcf0: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
fd00: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
fd10: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
fd20: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
fd30: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
fd40: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
fd50: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
fd60: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
fd70: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
fd80: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
fd90: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
fda0: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
fdb0: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
fdc0: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
fdd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
fde0: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
fdf0: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
fe00: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
fe10: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
fe20: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
fe30: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50   result sqlite3P
fe40: 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a  agerClose().  .*
fe50: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
fe60: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
fe70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
fe80: 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ef()..*/.void sq
fe90: 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73  lite3PagerSetDes
fea0: 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70  tructor(Pager *p
feb0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44  Pager, void (*xD
fec0: 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  esc)(DbPage*,int
fed0: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44  )){.  pPager->xD
fee0: 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73  estructor = xDes
fef0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
ff00: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
ff10: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
ff20: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
ff30: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
ff40: 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77  r.** is called w
ff50: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
ff60: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63  of a page in cac
ff70: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
ff80: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a  o its original.*
ff90: 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73  * value as a res
ffa0: 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ult of a rollbac
ffb0: 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  k.  The callback
ffc0: 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65   gives higher-le
ffd0: 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f  vel code.** an o
ffe0: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65  pportunity to re
fff0: 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20  store the EXTRA 
10000 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65  section to agree
10010 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
10020 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  ed.** page data.
10030 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10040 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72  PagerSetReiniter
10050 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10060 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28  void (*xReinit)(
10070 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
10080 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
10090 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a  er = xReinit;.}.
100a0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
100b0 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72  age size.  Retur
100c0 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20  n the new size. 
100d0 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20   If the suggest 
100e0 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  new page.** size
100f0 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74   is inappropriat
10100 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72  e, then an alter
10110 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65  native page size
10120 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20   is selected.** 
10130 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  and returned..*/
10140 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
10150 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67  rSetPagesize(Pag
10160 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
10170 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73  pageSize){.  ass
10180 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35  ert( pageSize>=5
10190 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
101a0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
101b0 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70  SIZE );.  if( !p
101c0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20  Pager->memDb && 
101d0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
101e0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
101f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
10200 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10210 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
10220 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10230 63 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c  ce = sqlite3Real
10240 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65 72  locOrFree(pPager
10250 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67  ->pTmpSpace, pag
10260 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65  eSize);.  }.  re
10270 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67  turn pPager->pag
10280 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
10290 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
102a0 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
102b0 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
102c0 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
102d0 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
102e0 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
102f0 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
10300 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
10310 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
10320 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
10330 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
10340 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
10350 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
10360 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
10370 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
10380 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
10390 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
103a0 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
103b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
103c0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
103d0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
103e0 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
103f0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
10400 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
10410 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
10420 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10430 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
10440 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
10450 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10460 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
10470 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
10480 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
10490 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
104a0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
104b0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
104c0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
104d0 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
104e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
104f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10500 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
10510 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
10520 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10530 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
10540 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
10550 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
10560 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
10570 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
10580 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
10590 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
105a0 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
105b0 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
105c0 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
105d0 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
105e0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
105f0 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
10600 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
10610 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
10620 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
10630 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
10640 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
10650 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
10660 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
10670 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
10680 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
10690 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
106a0 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
106b0 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
106c0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
106d0 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
106e0 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
106f0 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
10700 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
10710 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
10720 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
10730 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
10740 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
10750 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
10760 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10770 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
10780 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
10790 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b   if( MEMDB==0 ){
107a0 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
107b0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
107c0 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ();.    sqlite3O
107d0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
107e0 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  , 0);.    enable
107f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10800 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52  rors();.    IOTR
10810 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
10820 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
10830 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
10840 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
10850 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29  r->fd, pDest, N)
10860 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10870 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
10880 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
10890 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
108a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
108b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
108c0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
108d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
108e0 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
108f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10900 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
10910 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
10920 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
10930 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
10940 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
10950 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
10960 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
10970 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
10980 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
10990 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
109a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
109b0 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
109c0 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
109d0 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
109e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
109f0 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
10a00 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
10a10 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
10a20 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
10a30 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
10a40 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e  pPager){.  i64 n
10a50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
10a60 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
10a70 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10a80 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
10a90 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10aa0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
10ab0 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
10ac0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
10ad0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
10ae0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
10af0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
10b00 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51  er->fd, &n))!=SQ
10b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10b20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
10b30 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
10b40 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10b50 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e      if( n>0 && n
10b60 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  <pPager->pageSiz
10b70 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31  e ){.      n = 1
10b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10b90 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e     n /= pPager->
10ba0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10bb0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10bc0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
10bd0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
10be0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
10bf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10c00 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54   n==(PENDING_BYT
10c10 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
10c20 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  ze) ){.    n++;.
10c30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
10c40 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
10c50 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10c60 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50  ./*.** Clear a P
10c70 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a  gHistory block.*
10c80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
10c90 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73  earHistory(PgHis
10ca0 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20  tory *pHist){.  
10cb0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
10cc0 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69  ->pOrig);.  sqli
10cd0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
10ce0 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
10cf0 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
10d00 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
10d10 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
10d20 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
10d30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
10d40 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
10d50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
10d60 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
10d70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  );../*.** Unlink
10d80 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
10d90 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
10da0 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
10db0 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
10dc0 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
10dd0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
10de0 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
10df0 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
10e00 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
10e10 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
10e20 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  rMovepage() rout
10e30 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
10e40 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
10e50 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
10e60 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
10e70 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
10e80 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
10e90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
10ea0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
10eb0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
10ec0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
10ed0 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
10ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
10ef0 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
10f00 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
10f10 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
10f20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10f30 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
10f40 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
10f50 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
10f60 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
10f70 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
10f80 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
10f90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
10fa0 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20  ash[pPg->pgno & 
10fb0 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
10fc0 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  )]!=pPg );.    p
10fd0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
10fe0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
10ff0 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
11000 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
11010 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
11020 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
11030 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
11040 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
11050 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
11060 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
11070 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
11080 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
11090 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
110a0 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
110b0 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
110c0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
110d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
110e0 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
110f0 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
11100 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
11110 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
11120 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
11130 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
11140 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
11150 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
11160 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
11170 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
11180 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
11190 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
111a0 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
111b0 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
111c0 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
111d0 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
111e0 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
111f0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
11200 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
11210 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
11220 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
11230 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
11240 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
11250 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
11260 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
11270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
11280 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
11290 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
112a0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
112b0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
112c0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
112d0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
112e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
112f0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
11300 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
11310 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
11320 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
11330 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
11340 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
11350 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
11360 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
11370 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
11380 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11390 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
113a0 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
113b0 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
113c0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
113d0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
113e0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
113f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
11400 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
11410 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
11420 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
11430 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
11440 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11450 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
11460 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11470 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
11480 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncate an in-memo
11490 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65  ry database.  De
114a0 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65  lete.** all page
114b0 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20  s whose pgno is 
114c0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
114d0 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69  er->dbSize and i
114e0 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a  s unreferenced..
114f0 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
11500 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
11510 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
11520 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74  re zeroed..*/.st
11530 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79  atic void memory
11540 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
11550 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
11560 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
11570 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
11580 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
11590 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
115a0 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
115b0 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
115c0 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
115d0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
115e0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
115f0 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
11600 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
11610 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
11620 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
11630 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
11640 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
11650 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
11660 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
11670 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
11680 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
11690 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
116a0 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
116b0 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65  pPg);.      make
116c0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
116d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
116e0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
116f0 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
11700 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
11710 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  ine memoryTrunca
11720 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  te(p).#endif../*
11730 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
11740 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
11750 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
11760 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
11770 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
11780 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
11790 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
117a0 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
117b0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
117c0 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
117d0 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
117e0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
117f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
11800 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
11810 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
11820 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
11830 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
11840 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
11850 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
11860 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
11870 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
11880 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53  rc;..  /* The OS
11890 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
118a0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
118b0 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
118c0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
118d0 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
118e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
118f0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
11900 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
11910 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
11920 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
11930 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
11940 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
11950 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
11960 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
11970 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
11980 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a  ust be unknown *
11990 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
119a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
119b0 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
119c0 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d  r->dbSize<0 || M
119d0 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70  EMDB );..  if( p
119e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
119f0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
11a00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11a10 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
11a20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11a30 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
11a40 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
11a50 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
11a60 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
11a70 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11a80 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
11a90 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
11aa0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11ac0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11ad0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
11ae0 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
11af0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
11b00 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
11b10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
11b20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
11b30 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
11b40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
11b50 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
11b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
11b70 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65  gerTruncate(Page
11b80 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
11b90 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
11ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11bb0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11bc0 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42  _SHARED || MEMDB
11bd0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
11be0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
11bf0 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
11c00 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
11c10 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
11c20 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  rrCode;.    retu
11c30 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
11c40 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
11c50 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
11c60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11c70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11c80 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
11c90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
11ca0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  = nPage;.    mem
11cb0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
11cc0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
11cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11ce0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
11cf0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
11d00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11d10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
11d30 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11d40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
11d50 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
11d60 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
11d70 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11d80 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
11d90 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
11da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11db0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11dc0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
11dd0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
11de0 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  r, nPage);.  if(
11df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11e00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
11e10 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11e20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11e30 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
11e40 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
11e50 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
11e60 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
11e70 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
11e80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
11e90 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
11ea0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
11eb0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
11ec0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
11ed0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
11ee0 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
11ef0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
11f00 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
11f10 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
11f20 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
11f30 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
11f40 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
11f50 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
11f60 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
11f70 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
11f80 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
11f90 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
11fa0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
11fb0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
11fc0 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
11fd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
11fe0 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
11ff0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
12000 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
12010 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
12020 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
12030 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
12040 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
12050 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
12060 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
12070 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
12080 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
12090 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
120a0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
120b0 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  er){.#ifdef SQLI
120c0 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
120d0 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
120e0 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
120f0 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
12100 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
12110 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
12120 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
12130 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
12140 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
12150 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
12160 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
12170 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
12180 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
12190 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
121a0 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
121b0 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
121c0 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
121d0 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
121e0 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  n be set..  */. 
121f0 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
12200 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
12210 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
12220 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61  t( pPager );.  a
12230 73 73 65 72 74 28 20 70 54 73 64 20 26 26 20 70  ssert( pTsd && p
12240 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23  Tsd->nAlloc );.#
12250 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65  endif..  disable
12260 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12270 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72  rors();.  pPager
12280 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
12290 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
122a0 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
122b0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
122c0 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  );.  pagerUnlock
122d0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
122e0 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  er);.  enable_si
122f0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
12300 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
12310 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
12320 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
12330 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
12340 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
12350 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20 70  er)).  assert( p
12360 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
12370 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
12380 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
12390 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
123a0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
123b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
123c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
123d0 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
123e0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
123f0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
12400 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
12410 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
12420 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
12430 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
12440 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  stfd);.  }.  sql
12450 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
12460 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54  ger->fd);.  /* T
12470 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
12480 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
12490 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
124a0 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
124b0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
124c0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
124d0 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
124e0 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
124f0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
12500 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
12510 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  ANAGEMENT.  /* R
12520 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20  emove the pager 
12530 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20  from the linked 
12540 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 73  list of pagers s
12550 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a  tarting at .  **
12560 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61 67   ThreadData.pPag
12570 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  er if memory-man
12580 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
12590 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
125a0 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61  Pager==pTsd->pPa
125b0 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d  ger ){.    pTsd-
125c0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
125d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
125e0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d  {.    Pager *pTm
125f0 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20  p;.    for(pTmp 
12600 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20  = pTsd->pPager; 
12610 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61  pTmp->pNext!=pPa
12620 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  ger; pTmp=pTmp->
12630 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d  pNext){}.    pTm
12640 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  p->pNext = pPage
12650 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65  r->pNext;.  }.#e
12660 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65  ndif.  sqliteFre
12670 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
12680 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
12690 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
126a0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
126b0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
126c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
126d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
126e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
126f0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
12700 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
12710 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
12720 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
12730 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
12740 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
12750 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
12760 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
12770 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
12780 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
12790 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
127a0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
127b0 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
127c0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
127d0 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
127e0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
127f0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
12800 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
12810 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
12820 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
12830 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
12840 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
12850 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
12860 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
12870 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
12880 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
12890 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
128a0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
128b0 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
128c0 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
128d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
128e0 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
128f0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
12900 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
12910 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
12920 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
12930 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
12940 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
12950 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
12960 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12970 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
12980 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
12990 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
129a0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
129b0 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
129c0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
129d0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
129e0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
129f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12a00 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
12a10 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
12a20 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
12a30 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12a40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12a50 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12a60 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
12a70 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
12a80 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
12a90 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
12aa0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
12ab0 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
12ac0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
12ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12ae0 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
12af0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
12b00 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
12b10 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
12b20 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
12b30 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
12b40 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
12b50 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
12b60 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
12b70 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
12b80 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
12b90 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
12ba0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
12bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12bc0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
12bd0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
12be0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
12bf0 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
12c00 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
12c10 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
12c20 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
12c30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12c40 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
12c50 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
12c60 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
12c70 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
12c80 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
12c90 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
12ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12cb0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
12cc0 70 50 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66  pPg){.  page_ref
12cd0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
12ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12cf0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
12d00 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
12d10 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
12d20 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
12d30 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
12d40 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
12d50 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
12d60 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
12d70 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
12d80 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
12d90 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
12da0 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
12db0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
12dc0 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
12dd0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
12de0 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
12df0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
12e00 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
12e10 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
12e20 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
12e30 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
12e40 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
12e50 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
12e60 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
12e70 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
12e80 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
12e90 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
12ea0 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
12eb0 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
12ec0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
12ed0 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
12ee0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12ef0 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
12f00 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
12f10 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
12f20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
12f30 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
12f40 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
12f50 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
12f60 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12f70 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
12f80 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
12f90 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
12fa0 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
12fb0 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
12fc0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
12fd0 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
12fe0 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
12ff0 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
13000 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
13010 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
13020 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
13030 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
13040 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
13050 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
13060 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
13070 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
13080 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
13090 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
130a0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
130b0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
130c0 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
130d0 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
130e0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
130f0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
13100 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
13110 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
13120 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
13130 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
13140 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
13150 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
13160 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
13170 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
13180 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
13190 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
131a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
131b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
131c0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
131d0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
131e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
131f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
13200 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
13210 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
13220 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
13230 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
13240 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
13250 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
13260 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
13270 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
13280 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
13290 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
132a0 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
132b0 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
132c0 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
132d0 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
132e0 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
132f0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
13300 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
13310 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
13320 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
13330 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
13340 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
13350 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
13360 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
13370 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
13380 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
13390 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
133a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
133b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
133c0 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
133d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
133e0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
133f0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
13400 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
13410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
13420 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
13430 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
13440 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
13450 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
13460 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
13470 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
13480 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
13490 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
134a0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
134b0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
134c0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
134d0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
134e0 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
134f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13500 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
13510 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
13520 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
13530 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
13540 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13550 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
13560 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
13570 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
13580 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
13590 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
135a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
135b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
135c0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
135d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
135e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
135f0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
13600 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13620 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
13630 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
13640 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
13650 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13660 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
13670 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
13680 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
13690 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ager,.          
136a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
136b0 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
136c0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
136d0 63 29 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20  c), 4)).        
136e0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
136f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
13700 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
13710 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
13720 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
13730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13740 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
13750 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
13760 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  lOff);.        i
13770 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13780 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
13790 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
137a0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
137b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
137c0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
137d0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c  RACE(("JSYNC %d\
137e0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
137f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13800 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
13810 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
13820 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  fsync);.      if
13830 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
13840 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
13850 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
13860 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
13870 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
13880 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
13890 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
138a0 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
138b0 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
138c0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
138d0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
138e0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
138f0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
13900 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
13910 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
13920 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
13930 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
13940 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13950 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
13960 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
13970 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
13980 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
13990 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
139a0 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
139b0 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
139c0 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
139d0 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
139e0 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
139f0 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
13a00 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
13a10 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
13a20 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
13a30 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
13a40 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
13a50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13a60 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
13a70 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
13a80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
13a90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13aa0 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c  *.** Merge two l
13ab0 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f  ists of pages co
13ac0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
13ad0 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72  y and in pgno or
13ae0 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62  der..** Do not b
13af0 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70  oth fixing the p
13b00 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
13b10 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  rs..*/.static Pg
13b20 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c  Hdr *merge_pagel
13b30 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50  ist(PgHdr *pA, P
13b40 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48  gHdr *pB){.  PgH
13b50 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69  dr result, *pTai
13b60 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65  l;.  pTail = &re
13b70 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  sult;.  while( p
13b80 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69  A && pB ){.    i
13b90 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e  f( pA->pgno<pB->
13ba0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54  pgno ){.      pT
13bb0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
13bc0 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
13bd0 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  pA;.      pA = p
13be0 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  A->pDirty;.    }
13bf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69  else{.      pTai
13c00 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
13c10 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42        pTail = pB
13c20 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
13c30 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
13c40 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
13c50 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13c60 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69   = pA;.  }else i
13c70 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61  f( pB ){.    pTa
13c80 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
13c90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
13ca0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ail->pDirty = 0;
13cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
13cc0 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a  sult.pDirty;.}..
13cd0 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c  /*.** Sort the l
13ce0 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
13cf0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
13d00 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20  by pgno.  Pages 
13d10 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  are.** connected
13d20 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74   by pDirty point
13d30 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44  ers.  The pPrevD
13d40 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72  irty pointers ar
13d50 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62  e.** corrupted b
13d60 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a  y this sort..*/.
13d70 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
13d80 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23  UCKET_ALLOC 25.#
13d90 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
13da0 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69  CKET       25.#i
13db0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13dc0 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  .  int sqlite3_p
13dd0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
13de0 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66  et = 0;.  #undef
13df0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20   N_SORT_BUCKET. 
13e00 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f   #define N_SORT_
13e10 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c  BUCKET \.   (sql
13e20 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
13e30 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33  t_bucket?sqlite3
13e40 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
13e50 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b  cket:N_SORT_BUCK
13e60 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66  ET_ALLOC).#endif
13e70 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73  .static PgHdr *s
13e80 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ort_pagelist(PgH
13e90 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64  dr *pIn){.  PgHd
13ea0 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b  r *a[N_SORT_BUCK
13eb0 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20  ET_ALLOC], *p;. 
13ec0 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74   int i;.  memset
13ed0 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29  (a, 0, sizeof(a)
13ee0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20  );.  while( pIn 
13ef0 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a  ){.    p = pIn;.
13f00 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69      pIn = p->pDi
13f10 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
13f20 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ty = 0;.    for(
13f30 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=0; i<N_SORT_BU
13f40 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  CKET-1; i++){.  
13f50 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20      if( a[i]==0 
13f60 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  ){.        a[i] 
13f70 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = p;.        bre
13f80 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
13f90 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72  .        p = mer
13fa0 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
13fb0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b  , p);.        a[
13fc0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
13fd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
13fe0 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  =N_SORT_BUCKET-1
13ff0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76   ){.      /* Cov
14000 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65  erage: To get he
14010 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74  re, there need t
14020 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42  o be 2^(N_SORT_B
14030 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a  UCKET) .      **
14040 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
14050 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69   input list. Thi
14060 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62  s is possible, b
14070 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a  ut impractical..
14080 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67        ** Testing
14090 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68   this line is th
140a0 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61  e point of globa
140b0 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  l variable.     
140c0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65   ** sqlite3_page
140d0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e  r_n_sort_bucket.
140e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
140f0 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67  a[i] = merge_pag
14100 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
14110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20      }.  }.  p = 
14120 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  a[0];.  for(i=1;
14130 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54   i<N_SORT_BUCKET
14140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
14150 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70  merge_pagelist(p
14160 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  , a[i]);.  }.  r
14170 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
14180 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
14190 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
141a0 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
141b0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
141c0 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
141d0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
141e0 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
141f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
14200 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
14210 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
14220 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
14230 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
14240 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
14250 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
14260 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
14270 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
14280 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
14290 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
142a0 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
142b0 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
142c0 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
142d0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
142e0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
142f0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
14300 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
14310 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
14320 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
14330 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
14340 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
14350 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
14360 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
14370 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
14380 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
14390 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
143a0 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
143b0 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
143c0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
143d0 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
143e0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
143f0 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
14400 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
14410 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
14420 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
14430 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
14440 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
14450 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
14460 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
14470 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
14480 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
14490 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
144a0 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
144b0 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
144c0 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
144d0 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
144e0 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
144f0 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
14500 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
14510 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
14520 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
14530 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
14540 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
14550 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
14560 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
14570 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
14580 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
14590 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
145a0 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
145b0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
145c0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
145d0 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
145e0 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
145f0 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
14600 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
14610 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
14620 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
14630 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
14640 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
14650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
14670 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d  ;.  }..  pList =
14680 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70   sort_pagelist(p
14690 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  List);.  while( 
146a0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
146b0 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
146c0 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  y );.    rc = sq
146d0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
146e0 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
146f0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
14700 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14710 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
14720 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49  urn rc;.    /* I
14730 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
14740 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
14750 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
14760 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
14770 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
14780 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
14790 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
147a0 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20  PagerTruncate() 
147b0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
147c0 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
147d0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
147e0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
147f0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
14800 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
14810 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
14820 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
14830 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
14840 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
14850 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
14860 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
14870 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47  ODEC2(pPager, PG
14880 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
14890 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
148a0 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52   6);.      PAGER
148b0 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64  TRACE3("STORE %d
148c0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
148d0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
148e0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
148f0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
14900 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
14910 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
14920 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ).      rc = sql
14930 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
14940 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
14950 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14960 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43  ;.      TEST_INC
14970 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
14980 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
14990 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
149a0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
149b0 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
149c0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
149d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
149e0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
149f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
14a00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14a10 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
14a20 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
14a30 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14a40 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
14a50 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
14a60 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
14a70 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
14a80 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
14a90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14aa0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14ab0 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
14ac0 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
14ad0 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
14ae0 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
14af0 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
14b00 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
14b10 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
14b20 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
14b30 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
14b40 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
14b50 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
14b60 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
14b70 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
14b80 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
14b90 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  er->pDirty;.}../
14ba0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
14bb0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
14bc0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ot journal on th
14bd0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
14be0 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * A hot journal 
14bf0 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64  is one that need
14c00 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
14c10 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
14c20 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
14c30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14c40 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
14c50 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
14c60 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
14c70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
14c80 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
14c90 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
14ca0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
14cb0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a  he same name.  J
14cc0 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a  ust delete the j
14cd0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
14ce0 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
14cf0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
14d00 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r){.  if( !pPage
14d10 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
14d20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
14d30 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78  !sqlite3OsFileEx
14d40 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  ists(pPager->zJo
14d50 75 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20  urnal) ) return 
14d60 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
14d70 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
14d80 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ock(pPager->fd) 
14d90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14da0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
14db0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
14dc0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14dd0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14de0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
14df0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
14e00 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
14e10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
14e20 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
14e30 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
14e40 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
14e50 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
14e60 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
14e70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14e80 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
14e90 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
14ea0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
14eb0 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
14ec0 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
14ed0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
14ee0 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
14ef0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
14f00 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
14f10 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
14f20 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
14f30 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
14f40 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
14f50 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
14f60 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
14f70 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
14f80 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
14f90 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
14fa0 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
14fb0 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
14fc0 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
14fd0 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
14fe0 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
14ff0 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
15000 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
15010 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
15020 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
15030 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
15040 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
15050 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
15060 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
15070 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
15080 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
15090 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
150a0 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
150b0 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
150c0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
150d0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26  pPager->pFirst &
150e0 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d  & syncOk && !MEM
150f0 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  DB){.    int rc 
15100 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
15110 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
15120 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
15130 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15140 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
15150 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
15160 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
15170 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ync mode, write 
15180 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65  a new journal he
15190 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ader into the.  
151a0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
151b0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
151c0 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
151d0 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
151e0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61  nal.      ** hea
151f0 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
15200 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
15210 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
15220 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  at have.      **
15230 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
15240 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
15250 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
15260 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20  he header is.   
15270 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68     ** trashed wh
15280 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
15290 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20  d is updated).. 
152a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
152b0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
152c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
152d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
152e0 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73   > 0 );.      as
152f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
15300 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
15310 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
15320 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
15330 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15340 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
15350 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
15360 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
15370 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
15380 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
15390 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
153a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
153b0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
153c0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
153d0 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
153e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
153f0 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
15400 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
15410 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
15420 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
15430 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
15440 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
15450 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
15460 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
15470 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
15480 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
15490 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
154a0 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69  st( pPg );.    i
154b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
154c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
154d0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
154e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
154f0 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
15500 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
15510 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
15520 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
15530 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
15540 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
15550 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
15560 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
15570 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
15580 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
15590 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  Rollback() optim
155a0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
155b0 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
155c0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
155d0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
155e0 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
155f0 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
15600 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
15610 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
15620 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
15630 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
15640 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
15650 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
15660 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
15670 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
15680 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
15690 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
156a0 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
156b0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
156c0 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
156d0 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
156e0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
156f0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54  lback ){.    IOT
15700 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f  RACE(("ALWAYS_RO
15710 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50  LLBACK %p\n", pP
15720 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65  ager)).    pPage
15730 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
15740 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 1;.  }..  /*
15750 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
15760 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
15770 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
15780 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  hash table.  */.
15790 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
157a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
157b0 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20  ->pgno==0 );..  
157c0 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
157d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
157e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
157f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15800 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
15810 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
15820 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
15830 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
15840 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
15850 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
15860 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
15870 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
15880 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
15890 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
158a0 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a  teFree()ed..**.*
158b0 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75  * nReq is the nu
158c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
158d0 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
158e0 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68  . Once this much
158f0 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c   has.** been rel
15900 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  eased, the funct
15910 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e  ion returns. A n
15920 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f  egative value fo
15930 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20  r nReq means.** 
15940 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  free as much mem
15950 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  ory as possible.
15960 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15970 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
15980 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
15990 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
159a0 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  eased..*/.#ifdef
159b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
159c0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
159d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
159e0 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69  rReleaseMemory(i
159f0 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73  nt nReq){.  cons
15a00 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54  t ThreadData *pT
15a10 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68  sdro = sqlite3Th
15a20 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
15a30 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61  ();.  int nRelea
15a40 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  sed = 0;.  int i
15a50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
15a60 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
15a70 69 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75  is held, this su
15a80 62 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73  broutine becomes
15a90 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65   a.  ** o-op; ze
15aa0 72 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  ro bytes of memo
15ab0 72 79 20 61 72 65 20 66 72 65 65 64 2e 20 20 54  ry are freed.  T
15ac0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20  his is because. 
15ad0 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20   ** some of the 
15ae0 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20  code invoked by 
15af0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
15b00 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20  y also.  ** try 
15b10 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75  to obtain the mu
15b20 74 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69  tex, resulting i
15b30 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20  n a deadlock..  
15b40 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
15b50 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a  OsInMutex(0) ){.
15b60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15b70 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73  }..  /* Outermos
15b80 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20  t loop runs for 
15b90 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72  at most two iter
15ba0 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74  ations. First it
15bb0 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20  eration we.  ** 
15bc0 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f  try to find memo
15bd0 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  ry that can be r
15be0 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20  eleased without 
15bf0 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e  calling fsync().
15c00 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65   Second.  ** ite
15c10 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e  ration (which on
15c20 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65 20 66  ly runs if the f
15c30 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66  irst failed to f
15c40 72 65 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f  ree nReq bytes o
15c50 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69  f.  ** memory) i
15c60 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63  s permitted to c
15c70 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69  all fsync(). Thi
15c80 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d  s is of course m
15c90 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65  uch more .  ** e
15ca0 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20  xpensive..  */. 
15cb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20   for(i=0; i<=1; 
15cc0 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  i++){..    /* Lo
15cd0 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  op through all t
15ce0 68 65 20 53 51 4c 69 74 65 20 70 61 67 65 72 73  he SQLite pagers
15cf0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63   opened by the c
15d00 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a  urrent thread. *
15d10 2f 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  /.    Pager *pPa
15d20 67 65 72 20 3d 20 70 54 73 64 72 6f 2d 3e 70 50  ger = pTsdro->pP
15d30 61 67 65 72 3b 0a 20 20 20 20 66 6f 72 28 20 3b  ager;.    for( ;
15d40 20 70 50 61 67 65 72 20 26 26 20 28 6e 52 65 71   pPager && (nReq
15d50 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c  <0 || nReleased<
15d60 6e 52 65 71 29 3b 20 70 50 61 67 65 72 3d 70 50  nReq); pPager=pP
15d70 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ager->pNext){.  
15d80 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
15d90 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
15da0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
15db0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
15dc0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ue;.      }..   
15dd0 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70     /* For each p
15de0 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65  ager, try to fre
15df0 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20  e as many pages 
15e00 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74  as possible (wit
15e10 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63  hout .      ** c
15e20 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69  alling fsync() i
15e30 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
15e40 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
15e50 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a   the outermost .
15e60 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a        ** loop)..
15e70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77        */.      w
15e80 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  hile( SQLITE_OK=
15e90 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63  =(rc = pager_rec
15ea0 79 63 6c 65 28 70 50 61 67 65 72 2c 20 69 2c 20  ycle(pPager, i, 
15eb0 26 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b  &pPg)) && pPg) {
15ec0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
15ed0 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
15ee0 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
15ef0 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
15f00 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
15f10 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
15f20 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
15f30 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
15f40 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
15f50 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
15f60 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
15f70 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
15f80 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
15f90 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
15fa0 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
15fb0 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
15fc0 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
15fd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
15fe0 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
15ff0 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
16000 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
16010 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
16020 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
16030 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
16040 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16050 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
16060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16070 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  g );.        pag
16080 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
16090 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
160a0 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
160b0 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
160c0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
160d0 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  ->pAll = pPg->pN
160e0 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20  extAll;.        
160f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16100 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65   for( pTmp=pPage
16110 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70  r->pAll; pTmp->p
16120 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54  NextAll!=pPg; pT
16130 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  mp=pTmp->pNextAl
16140 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20  l ){}.          
16150 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d  pTmp->pNextAll =
16160 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
16170 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16180 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73    nReleased += s
16190 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70  qliteAllocSize(p
161a0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Pg);.        sql
161b0 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
161c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
161d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
161e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  {.        /* An 
161f0 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
16200 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
16210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16220 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  e or .        **
16230 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65   journal in page
16240 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65  r_recycle(). The
16250 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65   error is not re
16260 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20  turned to the . 
16270 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72         ** caller
16280 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
16290 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20  n. Instead, set 
162a0 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64  the Pager.errCod
162b0 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20  e variable..    
162c0 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72      ** The error
162d0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
162e0 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f  d to the user (o
162f0 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20  r users, in the 
16300 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  case .        **
16310 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67   of a shared pag
16320 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65  er cache) of the
16330 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
16340 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
16350 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
16360 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
16370 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
16380 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51  _IOERR || rc==SQ
16390 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20  LITE_FULL );.   
163a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
163b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
163c0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
163d0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
163e0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
163f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16400 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65  ..  return nRele
16410 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ased;.}.#endif /
16420 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
16430 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
16440 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T */../*.** This
16450 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
16460 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  led to obtain th
16470 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65  e shared lock re
16480 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a  quired before.**
16490 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61   data may be rea
164a0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
164b0 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73   cache. If the s
164c0 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61  hared lock has a
164d0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f  lready.** been o
164e0 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75  btained, this fu
164f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
16500 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61  p..**.** Immedia
16510 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
16520 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ning the shared 
16530 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65  lock (if require
16540 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  d), this functio
16550 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20  n.** checks for 
16560 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
16570 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f  le. If one is fo
16580 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63  und, an emergenc
16590 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73  y rollback.** is
165a0 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64   performed immed
165b0 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  iately..*/.stati
165c0 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65  c int pagerShare
165d0 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
165e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
165f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
16600 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
16610 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
16620 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
16630 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16640 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
16650 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
16660 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
16670 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ck ){.        rc
16680 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
16690 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
166a0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
166b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
166c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
166d0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
166e0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
166f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
16710 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
16720 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
16730 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49   }.  .      /* I
16740 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
16750 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
16760 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
16770 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
16780 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16790 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
167a0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
167b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
167c0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a  deleted..      *
167d0 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48  /.      if( hasH
167e0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
167f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16800 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
16810 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16820 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
16830 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
16840 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72          ** impor
16850 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
16860 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
16870 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
16880 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
16890 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
168a0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
168b0 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
168c0 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
168d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
168e0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
168f0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
16900 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
16910 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
16920 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16930 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
16940 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
16950 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
16960 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20  ing it .        
16970 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
16980 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   ** .        ** 
16990 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
169a0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
169b0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
169c0 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
169d0 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
169e0 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
169f0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
16a00 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
16a10 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  il to.        **
16a20 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
16a30 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16a40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16a50 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
16a60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
16a70 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
16a80 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
16a90 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
16aa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16ab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16ac0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
16ad0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
16ae0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16af0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16b10 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16b20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
16b30 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  E;. .        /* 
16b40 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
16b50 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
16b60 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
16b70 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
16b80 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
16b90 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
16ba0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
16bb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
16bc0 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   ** The journal 
16bd0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65  file does not ne
16be0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  ed to be locked 
16bf0 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20  itself.  The.   
16c00 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
16c10 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
16c20 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
16c30 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
16c40 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a   holds.        *
16c50 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
16c60 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
16c70 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
16c80 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
16c90 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73      ** processes
16ca0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75   opening the jou
16cb0 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65  rnal at the same
16cc0 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a   time..        *
16cd0 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  *..** Open the j
16ce0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
16cf0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
16d00 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
16d10 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d   ..** exclusive-
16d20 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
16d30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16d40 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
16d50 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
16d60 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
16d70 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
16d80 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
16d90 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
16da0 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
16db0 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
16dc0 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
16dd0 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
16de0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
16df0 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
16e00 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
16e10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16e20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16e30 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  Y;.        if( s
16e40 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
16e50 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
16e60 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
16e70 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20    int ro;.      
16e80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
16e90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
16ea0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16eb0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
16ec0 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a  dWrite(pPager->z
16ed0 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
16ee0 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20  ->jfd, &ro);.   
16ef0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
16f00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
16f10 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20  pPager->jfd );. 
16f20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 20           if( ro 
16f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
16f40 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
16f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
16f60 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
16f70 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
16f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16fb0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
16fc0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
16fd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16fe0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
16ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
17000 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17010 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
17020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
17030 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
17040 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
17050 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
17060 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
17070 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
17080 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17090 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
170a0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
170b0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
170c0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
170d0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
170e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
170f0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
17100 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
17110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17120 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
17130 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
17140 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
17170 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
17180 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
17190 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
171a0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
171b0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
171c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
171d0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
171e0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
171f0 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
17200 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
17210 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
17220 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
17230 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
17240 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
17250 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
17260 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
17270 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
17280 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
17290 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
172a0 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
172b0 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
172c0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
172d0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
172e0 6e 29 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65  n). If the value
172f0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
17300 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20 2a  ounter.        *
17310 2a 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  * stored in Page
17320 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 6d  r.iChangeCount m
17330 61 74 63 68 65 73 20 74 68 61 74 20 66 6f 75 6e  atches that foun
17340 64 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 0a 20  d on page 1 of. 
17350 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
17360 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
17370 6e 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68  n no database ch
17380 61 6e 67 65 73 20 68 61 76 65 20 6f 63 63 75 72  anges have occur
17390 65 64 20 73 69 6e 63 65 0a 20 20 20 20 20 20 20  ed since.       
173a0 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 61   ** the cache wa
173b0 73 20 6c 61 73 74 20 76 61 6c 69 64 20 61 6e 64  s last valid and
173c0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
173d0 65 74 61 69 6e 20 74 68 65 20 63 61 63 68 65 64  etain the cached
173e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
173f0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  s. Otherwise, if
17400 20 50 61 67 65 72 2e 69 43 68 61 6e 67 65 43 6f   Pager.iChangeCo
17410 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  unt does not mat
17420 63 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ch the.        *
17430 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  * change-counter
17440 20 6f 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68   on page 1 of th
17450 65 20 66 69 6c 65 2c 20 74 68 65 20 63 75 72 72  e file, the curr
17460 65 6e 74 20 63 61 63 68 65 20 63 6f 6e 74 65 6e  ent cache conten
17470 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 75  ts.        ** mu
17480 73 74 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  st be discarded.
17490 0a 20 20 20 20 20 20 20 20 2a 2f 0a 0a 20 20 20  .        */..   
174a0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
174b0 65 31 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  e1 = pager_looku
174c0 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  p(pPager, 1);.  
174d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 31        if( pPage1
174e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e   ){.          un
174f0 6c 69 6e 6b 50 61 67 65 28 70 50 61 67 65 31 29  linkPage(pPage1)
17500 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
17510 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 66 6f  Make sure the fo
17520 72 6d 65 72 20 70 61 67 65 20 31 20 69 73 20 72  rmer page 1 is r
17530 69 67 68 74 20 61 74 20 74 68 65 20 73 74 61 72  ight at the star
17540 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
17550 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 2e     ** free-list.
17560 20 54 68 69 73 20 74 72 69 67 67 65 72 73 20 61   This triggers a
17570 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e   special case in
17580 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
17590 67 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a  ge().          *
175a0 2a 20 74 6f 20 72 65 2d 75 73 65 20 74 68 69 73  * to re-use this
175b0 20 70 61 67 65 20 65 76 65 6e 20 69 66 20 74 68   page even if th
175c0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
175d0 66 20 70 61 67 65 73 20 69 6e 0a 20 20 20 20 20  f pages in.     
175e0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68       ** the cach
175f0 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 50  e is less than P
17600 61 67 65 72 2e 6d 78 50 61 67 65 2e 0a 20 20 20  ager.mxPage..   
17610 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17630 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 61 67  er->pFirst==pPag
17640 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
17650 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
17660 61 67 65 31 2d 3e 70 4e 65 78 74 46 72 65 65 20  age1->pNextFree 
17670 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
17680 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17690 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
176a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
176b0 61 67 65 72 2d 3e 70 46 69 72 73 74 2d 3e 70 50  ager->pFirst->pP
176c0 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 31  revFree = pPage1
176d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
176e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  e{.            a
176f0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
17700 70 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  pLast );.       
17710 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61       pPager->pLa
17720 73 74 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 20  st = pPage1;.   
17730 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17740 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
17750 74 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 20 20  t = pPage1;.    
17760 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
17770 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
17780 67 65 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ge1;.        }..
17790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
177a0 21 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50  !pager_lookup(pP
177b0 61 67 65 72 2c 20 31 29 20 29 3b 0a 20 20 20 20  ager, 1) );.    
177c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
177d0 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61  PagerAcquire(pPa
177e0 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  ger, 1, &pPage1,
177f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17810 7b 0a 09 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  {..  /* The chan
17820 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 73 74  ge-counter is st
17830 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74 20 32  ored at offset 2
17840 34 2e 20 53 65 65 20 61 6c 73 6f 0a 20 20 20 20  4. See also.    
17850 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69        ** pager_i
17860 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
17870 72 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  r()..          *
17880 2f 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  /.          u32 
17890 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72  iChangeCount = r
178a0 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
178b0 61 67 65 31 2c 20 32 34 29 3b 0a 20 20 20 20 20  age1, 24);.     
178c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
178d0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f++;.          s
178e0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
178f0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
17900 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
17910 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  --;.          if
17920 28 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d  ( iChangeCount!=
17930 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43  pPager->iChangeC
17940 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
17950 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
17960 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
17980 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
17990 75 6e 74 20 3d 20 69 43 68 61 6e 67 65 43 6f 75  unt = iChangeCou
179a0 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
179b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
179c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
179d0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
179e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
179f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
17a00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17a10 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17a20 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
17a30 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
17a40 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
17a50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
17a60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
17a70 63 61 74 65 20 6f 72 20 72 65 63 79 63 6c 65 20  cate or recycle 
17a80 73 70 61 63 65 20 66 6f 72 20 61 20 73 69 6e 67  space for a sing
17a90 6c 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  le page..*/.stat
17aa0 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f  ic int pagerAllo
17ab0 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a  catePage(Pager *
17ac0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a  pPager, PgHdr **
17ad0 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  ppPg){.  int rc 
17ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
17af0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
17b00 28 20 4d 45 4d 44 42 20 7c 7c 20 28 21 28 70 50  ( MEMDB || (!(pP
17b10 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
17b20 65 64 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  ed && pPager->pF
17b30 69 72 73 74 53 79 6e 63 65 64 2d 3e 70 67 6e 6f  irstSynced->pgno
17b40 3d 3d 30 29 20 26 26 20 28 0a 20 20 20 20 20 20  ==0) && (.      
17b50 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
17b60 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
17b70 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
17b80 30 20 7c 7c 20 0a 20 20 20 20 20 20 28 70 50 61  0 || .      (pPa
17b90 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
17ba0 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  d==0 && pPager->
17bb0 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 29 20  doNotSync).  )) 
17bc0 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
17bd0 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
17be0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
17bf0 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48  Page>=pPager->nH
17c00 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ash ){.      pag
17c10 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
17c20 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20  able(pPager,.   
17c30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48        pPager->nH
17c40 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20  ash<256 ? 256 : 
17c50 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29  pPager->nHash*2)
17c60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
17c70 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a  er->nHash==0 ){.
17c80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
17c90 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17ca0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
17cb0 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
17cc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
17cd0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
17ce0 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
17cf0 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
17d00 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
17d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
17d30 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d50 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
17d60 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
17d70 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 69 66 28  tory) );.    if(
17d80 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
17d90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
17da0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  EM;.      goto p
17db0 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
17dc0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
17dd0 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65  set(pPg, 0, size
17de0 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 69  of(*pPg));.    i
17df0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
17e00 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
17e10 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
17e20 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
17e30 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
17e40 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
17e50 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
17e60 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  pPg->pNextAll = 
17e70 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
17e80 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
17e90 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72   pPg;.    pPager
17ea0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
17eb0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
17ec0 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67  >pPager->nMaxPag
17ed0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
17ee0 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  t( pPager->nMaxP
17ef0 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50  age==(pPager->nP
17f00 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  age-1) );.      
17f10 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
17f20 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
17f30 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c  e{.    /* Recycl
17f40 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61  e an existing pa
17f50 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72  ge with a zero r
17f60 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20  ef-count. */.   
17f70 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
17f80 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  cle(pPager, 1, &
17f90 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
17fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17fb0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
17fc0 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
17fd0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
17fe0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
17ff0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
18000 20 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20    assert(pPg);. 
18010 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67   }.  *ppPg = pPg
18020 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  ;..pager_allocat
18030 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20  e_out:.  return 
18040 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
18050 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
18060 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
18070 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
18080 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
18090 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
180a0 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
180b0 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
180c0 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
180d0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
180e0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
180f0 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f   A _get works fo
18100 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
18110 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
18120 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
18130 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
18140 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
18150 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
18160 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
18170 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
18180 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
18190 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
181a0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
181b0 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
181c0 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
181d0 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
181e0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
181f0 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
18200 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
18210 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
18220 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
18230 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
18240 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
18250 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
18260 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
18270 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
18280 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
18290 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
182a0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
182b0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
182c0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
182d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
182e0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
182f0 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
18300 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
18310 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
18320 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
18330 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
18340 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
18350 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
18360 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
18370 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
18380 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
18390 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
183a0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
183b0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
183c0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
183d0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
183e0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
183f0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
18400 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
18410 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
18420 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
18430 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
18440 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
18450 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
18460 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
18470 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
18480 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
18490 2a 2a 0a 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67  **.** If clrFlag
184a0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
184b0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
184c0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
184d0 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
184e0 63 6c 66 46 6c 61 67 20 69 73 20 74 72 75 65 2c  clfFlag is true,
184f0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 70 61   it means the pa
18500 67 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  ge is about to b
18510 65 20 65 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20  e erased and.** 
18520 72 65 77 72 69 74 74 65 6e 20 77 69 74 68 6f 75  rewritten withou
18530 74 20 66 69 72 73 74 20 62 65 69 6e 67 20 72 65  t first being re
18540 61 64 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  ad so there is n
18550 6f 20 70 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67  o point it doing
18560 0a 2a 2a 20 74 68 65 20 64 69 73 6b 20 49 2f 4f  .** the disk I/O
18570 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18580 50 61 67 65 72 41 63 71 75 69 72 65 28 50 61 67  PagerAcquire(Pag
18590 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
185a0 20 70 67 6e 6f 2c 20 44 62 50 61 67 65 20 2a 2a   pgno, DbPage **
185b0 70 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46  ppPage, int clrF
185c0 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  lag){.  PgHdr *p
185d0 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
185e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
185f0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
18600 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
18610 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
18620 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  1 );..  /* The m
18630 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
18640 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
18650 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18660 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
18670 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
18680 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
18690 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
186a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
186b0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
186c0 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
186d0 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
186e0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
186f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18700 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18710 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
18720 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
18730 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
18740 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
18750 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
18760 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
18770 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
18780 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
18790 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
187a0 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
187b0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
187c0 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f  rrCode;.  }..  /
187d0 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
187e0 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65   first page acce
187f0 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61  ssed, then get a
18800 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a   SHARED lock.  *
18810 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
18820 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61  e file. pagerSha
18830 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e  redLock() is a n
18840 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20  o-op if .  ** a 
18850 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73  database lock is
18860 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20   already held.. 
18870 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
18880 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65  SharedLock(pPage
18890 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
188a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
188b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
188c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
188d0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
188e0 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20  OCK );..  pPg = 
188f0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
18900 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
18910 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
18920 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
18930 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
18940 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
18950 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
18960 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
18970 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
18980 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63  ->nMiss);.    rc
18990 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65   = pagerAllocate
189a0 50 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  Page(pPager, &pP
189b0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
189c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
189d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
189e0 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67    }..    pPg->pg
189f0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
18a00 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
18a10 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
18a20 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
18a30 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
18a40 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
18a50 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
18a60 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
18a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18a80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18a90 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
18aa0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
18ab0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
18ac0 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
18ad0 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
18ae0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
18af0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
18b00 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
18b10 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
18b20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
18b30 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
18b40 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
18b50 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
18b60 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
18b70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
18b80 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
18b90 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
18ba0 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
18bb0 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
18bc0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
18bd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
18be0 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
18bf0 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
18c00 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  Pg);.    }.    m
18c10 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
18c20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
18c30 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
18c40 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  g);..    pPager-
18c50 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
18c60 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
18c70 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
18c80 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
18c90 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
18ca0 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
18cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  );.    }.    nMa
18cc0 78 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  x = sqlite3Pager
18cd0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
18ce0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
18cf0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
18d00 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18d10 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
18d20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
18d30 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65  rrCode;.      re
18d40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
18d50 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
18d60 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61  the page with da
18d70 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65  ta, either by re
18d80 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
18d90 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
18da0 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69  ile, or by setti
18db0 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ng the entire pa
18dc0 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20  ge to zero..    
18dd0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  */.    if( nMax<
18de0 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
18df0 44 42 20 7c 7c 20 28 63 6c 72 46 6c 61 67 20 26  DB || (clrFlag &
18e00 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
18e10 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
18e20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
18e30 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
18e40 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18e50 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
18e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 45        assert( ME
18e70 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  MDB==0 );.      
18e80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
18e90 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
18ea0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
18eb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18ec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18ee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18ef0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
18f00 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
18f10 70 50 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20  pPg),.          
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
18f40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
18f50 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
18f60 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
18f70 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20  ager, pgno)).   
18f80 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
18f90 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
18fa0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18fb0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
18fc0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  ;.      CODEC1(p
18fd0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
18fe0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
18ff0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
19000 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19010 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
19020 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
19030 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
19040 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
19050 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
19060 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
19070 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19090 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
190a0 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20  ger->nRead);.   
190b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
190c0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65  /* Link the page
190d0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68   into the page h
190e0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ash table */.   
190f0 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61   h = pgno & (pPa
19100 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
19110 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21     assert( pgno!
19120 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  =0 );.    pPg->p
19130 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
19140 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
19150 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
19160 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
19170 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
19180 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19190 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
191a0 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
191b0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
191c0 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
191d0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23   = pPg;.    }..#
191e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
191f0 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
19200 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
19210 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
19220 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
19230 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
19240 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
19250 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
19260 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
19270 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c  pPager->nRef>0 |
19280 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20  | pgno==1);.    
19290 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33  if( pgno>sqlite3
192a0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
192b0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
192c0 2f 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  /* This can happ
192d0 65 6e 20 61 66 74 65 72 20 61 20 74 72 75 6e 63  en after a trunc
192e0 61 74 69 6f 6e 20 69 6e 20 65 78 63 6c 75 73 69  ation in exclusi
192f0 76 65 20 6d 6f 64 65 2e 20 54 68 65 20 70 61 67  ve mode. The pag
19300 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  er.      ** cach
19310 65 20 63 6f 6e 74 61 69 6e 73 20 70 61 67 65 73  e contains pages
19320 20 74 68 61 74 20 61 72 65 20 6c 6f 63 61 74 65   that are locate
19330 64 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  d after the end 
19340 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
19350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19360 5a 65 72 6f 20 73 75 63 68 20 70 61 67 65 73 20  Zero such pages 
19370 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
19380 2e 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73  . Not doing this
19390 20 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 63   .      ** was c
193a0 61 75 73 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ausing the probl
193b0 65 6d 20 72 65 70 6f 72 74 65 64 20 69 6e 20 74  em reported in t
193c0 69 63 6b 65 74 20 23 32 32 38 35 2e 0a 20 20 20  icket #2285..   
193d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
193e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
193f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
19400 69 73 20 63 61 73 65 20 63 61 74 63 68 65 73 20  is case catches 
19410 61 6e 20 49 4f 20 65 72 72 6f 72 20 69 6e 20 73  an IO error in s
19420 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
19430 6f 75 6e 74 28 29 2e 20 49 66 0a 20 20 20 20 20  ount(). If.     
19440 20 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 20     ** the error 
19450 6f 63 63 75 72 65 64 2c 20 50 61 67 65 72 50 61  occured, PagerPa
19460 67 65 63 6f 75 6e 74 28 29 20 72 65 74 75 72 6e  gecount() return
19470 65 64 20 30 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ed 0..        */
19480 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19490 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
194a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
194b0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
194c0 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
194d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
194e0 20 20 20 20 7d 0a 20 20 20 20 54 45 53 54 5f 49      }.    TEST_I
194f0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
19500 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  );.    page_ref(
19510 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
19520 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
19530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19540 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
19550 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
19560 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
19570 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
19580 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
19590 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
195a0 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
195b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
195c0 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
195d0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
195e0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65   cache..**.** Se
195f0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
19600 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
19610 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
19620 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
19630 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
19640 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
19650 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
19660 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
19670 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
19680 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
19690 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
196a0 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
196b0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
196c0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
196d0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
196e0 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
196f0 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
19700 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
19710 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
19720 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
19730 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19740 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
19750 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
19760 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
19770 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
19780 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
19790 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
197a0 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  UNLOCK ){.    as
197b0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
197c0 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  All || pPager->e
197d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
197e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
197f0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
19800 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
19810 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
19820 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
19830 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
19840 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
19850 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
19860 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20  .  if( pPg==0 ) 
19870 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65  return 0;.  page
19880 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
19890 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
198a0 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
198b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
198c0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
198d0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
198e0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
198f0 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
19900 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
19910 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
19920 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
19930 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
19940 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
19950 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
19960 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
19970 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
19980 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
19990 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
199a0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
199b0 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74  ..  /* Decrement
199c0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
199d0 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61  ount for this pa
199e0 67 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge.  */.  assert
199f0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
19a00 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
19a10 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
19a20 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
19a30 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
19a40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
19a50 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
19a60 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
19a70 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
19a80 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
19a90 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
19aa0 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
19ab0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
19ac0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
19ad0 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
19ae0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
19af0 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
19b00 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
19b10 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
19b20 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
19b30 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
19b40 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
19b50 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
19b60 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
19b70 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
19b80 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
19b90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
19ba0 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
19bb0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
19bc0 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
19bd0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
19be0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
19bf0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
19c00 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
19c10 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19c20 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
19c30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
19c40 73 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50  structor(pPg, pP
19c50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19c60 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
19c70 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
19c80 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
19c90 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
19ca0 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
19cb0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19cc0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19cd0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
19ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19cf0 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
19d00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19d10 6e 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61  nRef==0 && (!pPa
19d20 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
19d30 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  de || pPager->jo
19d40 75 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20  urnalOff>0) ){. 
19d50 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
19d60 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
19d70 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
19d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19d90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
19da0 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
19db0 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
19dc0 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
19dd0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
19de0 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
19df0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
19e00 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
19e10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19e20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
19e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
19e40 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
19e50 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
19e60 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
19e70 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
19e80 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
19e90 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
19ea0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
19eb0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
19ec0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
19ed0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
19ee0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
19ef0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19f00 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
19f10 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
19f20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19f30 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
19f40 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
19f50 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
19f60 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
19f70 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71  urnal==0 );.  sq
19f80 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
19f90 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
19fa0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19fb0 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
19fc0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
19fd0 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
19fe0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
19ff0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
1a000 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1a010 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1a020 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1a030 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1a040 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
1a050 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
1a060 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
1a070 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70      pPager->temp
1a0a0 46 69 6c 65 29 3b 0a 20 20 61 73 73 65 72 74 28  File);.  assert(
1a0b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1a0c0 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b  | pPager->jfd );
1a0d0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1a0e0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  alOff = 0;.  pPa
1a0f0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
1a100 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
1a110 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
1a120 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a130 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
1a140 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
1a150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
1a160 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
1a170 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a  Journal);.    }.
1a180 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1a190 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1a1a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
1a1b0 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
1a1c0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1a1d0 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20  >full_fsync);.  
1a1e0 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
1a1f0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
1a200 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
1a210 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  ync);.  sqlite3O
1a220 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
1a230 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1a240 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
1a250 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1a260 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
1a270 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1a280 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
1a290 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
1a2a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
1a2b0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
1a2c0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
1a2d0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
1a2e0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1a2f0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
1a300 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20  rCode;.    goto 
1a310 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1a320 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  ournal;.  }.  pP
1a330 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1a340 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1a350 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  e;..  rc = write
1a360 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1a370 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  r);..  if( pPage
1a380 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1a390 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1a3a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a3b0 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
1a3c0 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
1a3d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a3e0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1a3f0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  E_NOMEM ){.    r
1a400 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1a410 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1a420 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1a430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a440 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1a450 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
1a460 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c  return rc;..fail
1a470 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1a480 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  al:.  sqliteFree
1a490 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1a4a0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
1a4b0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
1a4c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a4d0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
1a4e0 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1a4f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1a500 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
1a510 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
1a520 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1a530 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
1a540 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1a550 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1a560 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1a570 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1a580 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  rRollback() is c
1a590 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1a5a0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1a5b0 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1a5c0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1a5d0 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c  erUnref() is cal
1a5e0 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
1a5f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
1a600 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1a610 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
1a620 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1a630 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
1a640 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
1a650 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
1a660 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
1a670 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
1a680 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
1a690 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
1a6a0 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
1a6b0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1a6c0 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
1a6d0 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
1a6e0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
1a6f0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
1a700 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1a710 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
1a720 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
1a730 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
1a740 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
1a750 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
1a760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
1a770 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
1a780 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1a790 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
1a7a0 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
1a7b0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
1a7c0 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
1a7d0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1a7e0 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
1a7f0 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
1a800 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
1a810 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
1a820 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
1a830 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
1a840 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
1a850 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1a860 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1a870 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1a880 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
1a890 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
1a8a0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1a8b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
1a8c0 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
1a8d0 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
1a8e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1a8f0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
1a900 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
1a910 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
1a920 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
1a930 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
1a940 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
1a950 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
1a960 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
1a970 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
1a980 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
1a990 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c  gin(DbPage *pPg,
1a9a0 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
1a9b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1a9c0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1a9d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a9e0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
1a9f0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
1aa00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1aa10 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1aa20 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
1aa30 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1aa40 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
1aa50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1aa60 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1aa70 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1aa80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1aa90 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1aaa0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
1aab0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1aac0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1aad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aae0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1aaf0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1ab00 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
1ab10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1ab20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1ab40 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
1ab50 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
1ab60 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
1ab70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1ab80 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1ab90 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
1aba0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
1abb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1abc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1abd0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1abe0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1abf0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1ac00 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
1ac10 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54    PAGERTRACE2("T
1ac20 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
1ac30 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1ac40 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
1ac50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1ac60 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
1ac70 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
1ac80 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
1ac90 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
1aca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1acb0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1acc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1acd0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1ace0 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
1acf0 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
1ad00 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
1ad10 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
1ad20 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74  access mode last
1ad30 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
1ad40 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
1ad50 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
1ad60 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
1ad70 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
1ad80 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
1ad90 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
1ada0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
1adb0 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
1adc0 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
1add0 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  nd truncated to 
1ade0 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 bytes..    */.
1adf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ae00 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
1ae10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1ae20 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30  r->origDbSize==0
1ae30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ae40 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ae50 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  al==0 );.    sql
1ae60 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1ae70 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
1ae80 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ae90 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  al = sqliteMallo
1aea0 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
1aeb0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  e/8 + 1 );.    i
1aec0 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
1aed0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
1aee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1aef0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
1af00 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
1af10 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1af20 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
1af30 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1af40 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1af50 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1af60 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1af70 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
1af80 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
1af90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1afa0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1afb0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
1afc0 61 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20  age dirty.  Set 
1afd0 69 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61  its dirty flag a
1afe0 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65  nd add it to the
1aff0 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c   dirty.** page l
1b000 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
1b010 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67  oid makeDirty(Pg
1b020 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
1b030 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
1b040 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
1b050 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1b060 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  r;.    pPg->dirt
1b070 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
1b080 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d  pDirty = pPager-
1b090 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28  >pDirty;.    if(
1b0a0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1b0b0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1b0c0 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
1b0d0 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rty = pPg;.    }
1b0e0 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44  .    pPg->pPrevD
1b0f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
1b100 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
1b110 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pg;.  }.}../*.**
1b120 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65   Make a page cle
1b130 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64  an.  Clear its d
1b140 69 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d  irty bit and rem
1b150 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ove it from the.
1b160 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69  ** dirty page li
1b170 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
1b180 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48  id makeClean(PgH
1b190 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
1b1a0 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
1b1b0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1b1c0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
1b1d0 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
1b1e0 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
1b1f0 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50  vDirty = pPg->pP
1b200 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  revDirty;.    }.
1b210 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
1b220 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  evDirty ){.     
1b230 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1b240 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
1b250 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
1b260 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
1b270 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
1b280 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
1b290 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
1b2a0 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
1b2b0 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20   as writeable.  
1b2c0 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
1b2d0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
1b2e0 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69  rnal .** if it i
1b2f0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
1b300 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ady.  This routi
1b310 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
1b320 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a  d before making.
1b330 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ** changes to a 
1b340 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
1b350 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
1b360 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1b370 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65  d, the pager cre
1b380 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f  ates a new.** jo
1b390 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72  urnal and acquir
1b3a0 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  es a RESERVED lo
1b3b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b3c0 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45  se.  If the RESE
1b3d0 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75  RVED.** lock cou
1b3e0 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72  ld not be acquir
1b3f0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
1b400 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1b410 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61  BUSY.  The.** ca
1b420 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75  lling routine mu
1b430 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61  st check for tha
1b440 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61  t return value a
1b450 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
1b460 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61  t to.** change a
1b470 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74  ny page data unt
1b480 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  il this routine 
1b490 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1b4a0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
1b4b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75  journal file cou
1b4c0 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ld not be writte
1b4d0 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  n because the di
1b4e0 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74  sk is full,.** t
1b4f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1b500 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1b510 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e  FULL and does an
1b520 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62   immediate rollb
1b530 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73  ack..** All subs
1b540 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74  equent write att
1b550 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72  empts also retur
1b560 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e  n SQLITE_FULL un
1b570 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  til there.** is 
1b580 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
1b590 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f  3PagerCommit() o
1b5a0 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  r sqlite3PagerRo
1b5b0 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72  llback() to.** r
1b5c0 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
1b5d0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
1b5e0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
1b5f0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48  oid *pData = PGH
1b600 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
1b610 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1b620 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1b630 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b640 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
1b650 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
1b660 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1b670 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20  errCode ){ .    
1b680 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1b690 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1b6a0 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
1b6b0 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
1b6c0 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
1b6d0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
1b6e0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1b6f0 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
1b700 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  (pPg);..  /* Mar
1b710 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
1b720 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
1b730 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1b740 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
1b750 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
1b760 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
1b770 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
1b780 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  */.  makeDirty(p
1b790 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
1b7a0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
1b7b0 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
1b7c0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
1b7d0 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
1b7e0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1b7f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
1b800 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
1b810 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
1b820 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
1b830 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
1b840 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1b850 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1b860 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
1b870 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
1b880 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
1b890 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
1b8a0 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
1b8b0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1b8c0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
1b8d0 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
1b8e0 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
1b8f0 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
1b900 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b910 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1b920 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
1b930 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1b940 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
1b950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1b970 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b990 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1b9a0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
1b9b0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1b9c0 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1b9d0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
1b9e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1b9f0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1ba00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1ba10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ba20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1ba30 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1ba40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1ba50 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
1ba60 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
1ba70 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1ba80 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
1ba90 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1baa0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
1bab0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
1bac0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
1bad0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1bae0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1baf0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1bb00 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
1bb10 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
1bb20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
1bb30 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
1bb40 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
1bb50 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
1bb60 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
1bb70 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
1bb80 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1bb90 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
1bba0 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
1bbb0 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1bbc0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1bbd0 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b         int szPg;
1bbe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d  .        if( MEM
1bbf0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
1bc00 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1bc10 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1bc20 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1bc30 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1bc40 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
1bc50 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1bc60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1bc70 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1bc80 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
1bc90 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
1bca0 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
1bcb0 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
1bcc0 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
1bcd0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
1bce0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1bcf0 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
1bd00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
1bd10 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
1bd20 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1bd30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1bd40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1bd50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1bd60 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
1bd70 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  m, saved;.      
1bd80 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1bd90 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 20  , *pEnd;.       
1bda0 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
1bdb0 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
1bdc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1bdd0 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
1bde0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
1bdf0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
1be00 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
1be10 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
1be20 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
1be30 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1be40 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
1be50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
1be60 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
1be70 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
1be80 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
1be90 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1bea0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1beb0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
1bec0 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
1bed0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
1bee0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
1bef0 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61 32     pEnd = pData2
1bf00 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
1bf10 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
1bf20 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20  Data2 -= 4;.    
1bf30 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
1bf40 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20  u32*)pEnd;.     
1bf50 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1bf60 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  End, cksum);.   
1bf70 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50         szPg = pP
1bf80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
1bf90 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33  ;.          put3
1bfa0 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50  2bits(pData2, pP
1bfb0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1bfc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bfd0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1bfe0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a 50  jfd, pData2, szP
1bff0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  g);.          IO
1c000 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
1c010 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
1c020 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1c030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c040 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1c050 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 0a  rnalOff, szPg)).
1c060 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1c070 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
1c080 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
1c090 50 41 47 45 52 54 52 41 43 45 34 28 22 4a 4f 55  PAGERTRACE4("JOU
1c0a0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
1c0b0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c0e0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1c0f0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
1c100 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70          *(u32*)p
1c110 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20  End = saved;... 
1c120 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
1c130 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
1c140 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1c150 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
1c160 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
1c170 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
1c180 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
1c190 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
1c1a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c1b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c1c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c1d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c1e0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1c1f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
1c200 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
1c210 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c220 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1c230 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1c240 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
1c250 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1c260 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1c270 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e            pPg->n
1c280 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
1c290 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
1c2a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1c2b0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1c2c0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1c2d0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
1c2e0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1c2f0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1c300 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
1c310 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1c320 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
1c330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1c350 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
1c360 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1c370 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
1c380 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
1c390 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1c3a0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1c3b0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1c3c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c3d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c3e0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1c3f0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
1c400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c410 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1c420 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c430 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1c440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1c450 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1c460 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1c470 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
1c480 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
1c490 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
1c4a0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
1c4b0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
1c4c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1c4d0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
1c4e0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
1c4f0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
1c500 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1c510 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
1c520 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
1c530 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
1c540 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
1c550 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
1c560 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
1c570 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
1c580 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1c590 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
1c5a0 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
1c5b0 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
1c5c0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
1c5d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1c5e0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
1c5f0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
1c600 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c610 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  e );.      if( M
1c620 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1c630 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1c640 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1c650 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1c660 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c670 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  Hist->pStmt==0 )
1c680 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
1c690 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  >pStmt = sqliteM
1c6a0 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
1c6b0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1c6c0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1c6d0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
1c6e0 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
1c6f0 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
1c700 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
1c710 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1c720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c730 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
1c740 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
1c750 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1c760 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1c770 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  >pgno);.      }e
1c780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
1c790 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
1c7a0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c7b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d  , pPg->pgno, 7)-
1c7c0 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  4;.        put32
1c7d0 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67  bits(pData2, pPg
1c7e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1c7f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1c800 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  rite(pPager->stf
1c810 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
1c820 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a  r->pageSize+4);.
1c830 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1c840 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1c850 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1c860 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c870 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1c880 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c8a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1c8b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c8c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1c8d0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1c8e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1c8f0 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1c900 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1c910 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1c920 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1c930 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o&7);.      }.  
1c940 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1c950 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1c960 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1c970 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
1c980 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
1c990 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
1c9a0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1c9b0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1c9c0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1c9d0 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
1c9e0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
1c9f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1ca00 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
1ca10 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
1ca20 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
1ca30 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
1ca40 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
1ca50 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1ca60 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
1ca70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ca80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ca90 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
1caa0 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
1cab0 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
1cac0 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
1cad0 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
1cae0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
1caf0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1cb00 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
1cb10 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
1cb20 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
1cb30 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
1cb40 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1cb50 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1cb60 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
1cb70 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
1cb80 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
1cb90 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
1cba0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
1cbb0 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
1cbc0 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
1cbd0 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
1cbe0 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
1cbf0 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
1cc00 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
1cc10 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1cc20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1cc30 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
1cc40 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
1cc50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
1cc60 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1cc70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cc80 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
1cc90 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1cca0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1ccb0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1ccc0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
1ccd0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
1cce0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
1ccf0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
1cd00 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
1cd10 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
1cd20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
1cd30 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
1cd40 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1cd50 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1cd60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1cd70 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1cd90 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1cda0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
1cdb0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
1cdc0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cde0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1cdf0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
1ce00 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
1ce10 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a   int ii;..    /*
1ce20 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
1ce30 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
1ce40 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
1ce50 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
1ce60 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
1ce70 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
1ce80 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
1ce90 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
1cea0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1ceb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1cec0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1ced0 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
1cee0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1cef0 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
1cf00 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
1cf10 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
1cf20 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
1cf30 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
1cf40 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
1cf50 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
1cf60 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
1cf70 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
1cf80 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
1cf90 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1cfa0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1cfb0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
1cfc0 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
1cfd0 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
1cfe0 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
1cff0 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
1d000 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69  PageCount = sqli
1d010 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1d020 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1d030 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
1d040 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1d050 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
1d060 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
1d070 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
1d080 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
1d090 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
1d0a0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1d0b0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
1d0c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d0d0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
1d0e0 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
1d0f0 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
1d100 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
1d110 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
1d120 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
1d130 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
1d140 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
1d150 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
1d160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
1d170 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
1d180 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
1d190 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1d1a0 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67  aInJournal || pg
1d1b0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a  ==pPg->pgno || .
1d1c0 20 20 20 20 20 20 20 20 20 20 70 67 3e 70 50 61            pg>pPa
1d1d0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1d1e0 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  || !(pPager->aIn
1d1f0 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31  Journal[pg/8]&(1
1d200 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20 20 20  <<(pg&7))).     
1d210 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   ) {.        if(
1d220 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
1d230 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1d240 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
1d250 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1d260 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d270 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
1d280 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
1d290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d2a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d2b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1d2c0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1d2d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1d2e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
1d2f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1d300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d310 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
1d320 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1d330 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
1d340 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1d350 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
1d360 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d370 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
1d380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d3a0 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
1d3b0 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
1d3c0 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
1d3d0 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
1d3e0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1d3f0 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
1d400 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
1d410 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
1d420 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
1d430 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1d440 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
1d450 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
1d460 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1d470 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
1d480 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
1d490 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69  ->dirty;.}.#endi
1d4a0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1d4b0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
1d4c0 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
1d4d0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
1d4e0 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
1d4f0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1d500 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
1d510 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
1d520 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77  qlite3PagerOverw
1d530 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
1d540 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
1d550 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
1d560 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
1d570 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
1d580 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1d590 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29  ger, pgno, &pPg)
1d5a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1d5b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1d5c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d5d0 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ite(pPg);.    if
1d5e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d5f0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1d600 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
1d610 61 74 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c  ata(pPg), pData,
1d620 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d630 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1d640 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1d650 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
1d660 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1d670 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1d680 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1d690 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1d6a0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
1d6b0 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
1d6c0 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
1d6d0 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
1d6e0 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
1d6f0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
1d700 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
1d710 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
1d720 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
1d730 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
1d740 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
1d750 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1d760 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
1d770 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
1d780 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
1d790 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
1d7a0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
1d7b0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
1d7c0 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
1d7d0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1d7e0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
1d7f0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
1d800 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
1d810 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
1d820 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d830 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
1d840 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
1d850 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
1d860 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
1d870 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
1d880 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
1d890 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
1d8a0 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
1d8b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1d8c0 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
1d8d0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
1d8e0 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
1d8f0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1d900 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
1d910 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
1d920 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
1d930 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
1d940 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
1d950 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1d960 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
1d970 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
1d980 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
1d990 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
1d9a0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
1d9b0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
1d9c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
1d9d0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1d9e0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1d9f0 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
1da00 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
1da10 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
1da20 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
1da30 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
1da40 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
1da50 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
1da60 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
1da70 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1da80 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
1da90 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  * the sqlite3Pag
1daa0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1dab0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1dac0 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
1dad0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1dae0 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64  tains critical d
1daf0 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
1db00 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
1db10 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20   gets.** rolled 
1db20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
1db30 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1db40 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1db50 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
1db60 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1db70 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
1db80 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1db90 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1dba0 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1dbb0 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
1dbc0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1dbd0 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
1dbe0 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a  t( pPg!=0 );  /*
1dbf0 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f   We never call _
1dc00 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65 73  dont_write unles
1dc10 73 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  s the page is in
1dc20 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61   mem */.  pPg->a
1dc30 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1dc40 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
1dc50 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
1dc60 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1dc70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1dc80 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1dc90 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1dca0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1dcb0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1dcc0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1dcd0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1dce0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1dcf0 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1dd00 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1dd10 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1dd20 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1dd30 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1dd40 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1dd50 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1dd60 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1dd70 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1dd80 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1dd90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1dda0 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1ddb0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1ddc0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1ddd0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1dde0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1ddf0 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1de00 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1de10 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1de20 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1de30 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1de40 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1de50 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1de60 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1de70 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1de80 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1de90 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1dea0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1deb0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1dec0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1ded0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1dee0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1def0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1df00 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
1df10 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f  d of %d\n", pgno
1df20 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1df30 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1df40 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
1df50 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1df60 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  )).      makeCle
1df70 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20  an(pPg);.#ifdef 
1df80 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1df90 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
1dfa0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1dfb0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1dfc0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
1dfd0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
1dfe0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
1dff0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
1e000 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
1e010 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
1e020 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1e030 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1e040 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
1e050 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
1e060 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1e070 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
1e080 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
1e090 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
1e0a0 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
1e0b0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  journal..*/.void
1e0c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1e0d0 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65  tRollback(DbPage
1e0e0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1e0f0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1e100 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Pager;..  assert
1e110 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1e120 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1e130 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1e140 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1e150 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1e160 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1e170 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
1e180 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1e190 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1e1a0 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
1e1b0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
1e1c0 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1e1d0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1e1e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1e1f0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1e200 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
1e210 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
1e220 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1e230 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1e240 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1e250 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  al = 1;.    if( 
1e260 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1e270 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1e280 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1e290 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1e2a0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1e2b0 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
1e2c0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
1e2d0 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52     }.    PAGERTR
1e2e0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
1e2f0 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
1e300 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
1e310 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e320 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
1e330 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e  "GARBAGE %p %d\n
1e340 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1e350 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28  pgno)).  }.  if(
1e360 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1e370 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
1e380 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
1e390 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1e3a0 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
1e3b0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1e3c0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1e3d0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1e3e0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1e3f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e400 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1e410 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1e420 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1e430 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1e440 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
1e450 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1e460 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  Pg);.  }.}.../*.
1e470 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e480 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
1e490 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
1e4a0 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
1e4b0 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
1e4c0 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
1e4d0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1e4e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e4f0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1e500 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
1e510 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
1e520 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
1e530 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
1e540 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1e550 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
1e560 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ountDone ){.    
1e570 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1e580 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1e590 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
1e5a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e5b0 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
1e5c0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
1e5d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e5e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e5f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e600 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
1e610 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e620 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1e630 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 61  c;.  .    /* Rea
1e640 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
1e650 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20  lue at byte 24. 
1e660 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  */.    change_co
1e670 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
1e680 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
1e690 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e  4);.  .    /* In
1e6a0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1e6b0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1e6c0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1e6d0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1e6e0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1e6f0 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  +;.    put32bits
1e700 28 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54  (((char*)PGHDR_T
1e710 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b  O_DATA(pPgHdr))+
1e720 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
1e730 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1e740 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20  >iChangeCount = 
1e750 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1e760 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
1e770 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
1e780 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
1e790 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1e7a0 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
1e7b0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1e7c0 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
1e7d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1e7f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e800 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1e810 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1e820 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1e830 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1e840 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1e850 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1e860 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1e870 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1e880 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1e890 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1e8a0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1e8b0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1e8c0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1e8d0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1e8e0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1e8f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e900 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1e910 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1e920 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1e930 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1e940 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1e950 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1e960 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1e970 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1e980 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1e990 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1e9a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1e9b0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1e9c0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1e9d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1e9e0 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1e9f0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1ea00 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1ea10 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1ea20 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1ea30 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1ea40 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1ea50 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1ea60 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
1ea70 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1ea80 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
1ea90 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1eaa0 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
1eab0 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
1eac0 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
1ead0 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
1eae0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1eaf0 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es)..*/.int sqli
1eb00 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1eb10 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50  aseOne(Pager *pP
1eb20 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
1eb30 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20   *zMaster, Pgno 
1eb40 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
1eb50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1eb60 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44    PAGERTRACE4("D
1eb70 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
1eb80 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
1eb90 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
1eba0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
1ebb0 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
1ebc0 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a  , nTrunc);..  /*
1ebd0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1ebe0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
1ebf0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
1ec00 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
1ec10 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
1ec20 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1ec30 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
1ec40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1ec50 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1ec60 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
1ec70 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
1ec80 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1ec90 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
1eca0 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
1ecb0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1ecc0 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
1ecd0 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1ece0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1ecf0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1ed00 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1ed10 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1ed20 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1ed30 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1ed40 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1ed50 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1ed60 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1ed70 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1ed80 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1ed90 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1eda0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1edb0 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1edc0 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1edd0 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1ede0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1edf0 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1ee00 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1ee10 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1ee20 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1ee30 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1ee40 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1ee50 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1ee60 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1ee70 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1ee80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ee90 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1eea0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1eeb0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1eec0 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
1eed0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1eee0 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
1eef0 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
1ef00 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
1ef10 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
1ef20 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
1ef30 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
1ef40 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
1ef50 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
1ef60 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
1ef70 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
1ef80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ef90 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1efa0 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50     int iSkip = P
1efb0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1efc0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ger);.        fo
1efd0 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
1efe0 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1eff0 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
1f000 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61         if( !(pPa
1f010 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1f020 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29  i/8] & (1<<(i&7)
1f030 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  )) && i!=iSkip )
1f040 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f050 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1f060 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1f070 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1f080 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f090 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1f0a0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
1f0b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f0c0 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
1f0d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f0e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1f0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1f100 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f110 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1f120 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f130 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
1f140 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
1f150 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
1f160 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
1f170 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
1f180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f190 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1f1a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
1f1b0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
1f1c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f1d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1f1e0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1f1f0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1f200 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f210 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
1f220 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
1f230 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
1f240 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
1f250 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
1f260 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f270 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1f280 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1f290 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
1f2a0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1f2b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f2c0 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
1f2d0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
1f2e0 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
1f2f0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1f300 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1f310 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1f320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1f330 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1f340 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1f350 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79   = 0;..    /* Sy
1f360 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1f370 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1f380 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1f390 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1f3a0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1f3b0 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
1f3c0 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
1f3d0 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
1f3e0 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
1f3f0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1f400 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c  ER_SYNCED;.  }el
1f410 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  se if( MEMDB && 
1f420 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1f430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f440 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
1f450 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
1f460 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
1f470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1f480 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1f490 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1f4a0 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
1f4b0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1f4c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1f4d0 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
1f4e0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
1f4f0 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
1f500 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
1f510 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1f520 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
1f530 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
1f540 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1f550 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1f560 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1f570 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
1f580 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1f590 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
1f5a0 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
1f5b0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1f5c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1f5d0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
1f5e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1f5f0 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
1f600 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1f610 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1f620 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
1f630 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
1f640 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1f650 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1f660 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
1f670 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
1f680 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
1f690 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
1f6a0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
1f6b0 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
1f6c0 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
1f6d0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1f6e0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
1f6f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1f700 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
1f710 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1f720 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1f730 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
1f740 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
1f750 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1f760 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
1f770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1f780 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
1f790 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1f7a0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
1f7b0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
1f7c0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
1f7d0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
1f7e0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1f7f0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1f800 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
1f810 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
1f820 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1f830 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
1f840 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
1f850 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
1f860 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
1f870 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
1f880 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
1f890 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1f8a0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
1f8b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f8c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1f8d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1f8e0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
1f8f0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1f900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f910 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1f920 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61  R_SYNCED || !pPa
1f930 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1f940 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
1f950 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1f960 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1f970 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1f980 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
1f990 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
1f9a0 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
1f9b0 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
1f9c0 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1f9d0 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
1f9e0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
1f9f0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
1fa00 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
1fa10 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
1fa20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
1fa30 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
1fa40 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
1fa50 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
1fa60 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
1fa70 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
1fa80 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
1fa90 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
1faa0 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
1fab0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
1fac0 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
1fad0 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
1fae0 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
1faf0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
1fb00 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
1fb10 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
1fb20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
1fb30 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
1fb40 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
1fb50 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
1fb60 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
1fb70 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
1fb80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1fb90 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1fba0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1fbb0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1fbc0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1fbd0 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
1fbe0 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
1fbf0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1fc00 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1fc10 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
1fc20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
1fc30 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
1fc40 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
1fc50 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
1fc60 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
1fc70 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1fc80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
1fc90 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
1fca0 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
1fcb0 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
1fcc0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
1fcd0 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
1fce0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
1fcf0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
1fd00 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
1fd10 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
1fd20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1fd30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1fd40 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
1fd50 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
1fd60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
1fd70 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
1fd80 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
1fd90 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
1fda0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
1fdb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1fdc0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1fdd0 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
1fde0 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
1fdf0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1fe00 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1fe10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
1fe20 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45  AGERTRACE3("PAGE
1fe30 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
1fe40 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
1fe50 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1fe60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1fe70 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
1fe80 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
1fe90 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1fea0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1feb0 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74  .      p->inStmt
1fec0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
1fed0 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e  PrevStmt = p->pN
1fee0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1fef0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
1ff00 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
1ff10 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1ff20 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d  niter(p, pPager-
1ff30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1ff40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
1ff50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
1ff60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
1ff70 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
1ff80 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1ff90 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1ffa0 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
1ffb0 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
1ffc0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1ffd0 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
1ffe0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1fff0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
20000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20010 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
20020 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
20030 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
20040 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
20050 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
20060 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
20070 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
20080 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
20090 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
200a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
200b0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
200c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
200d0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
200e0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
200f0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
20100 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
20110 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
20120 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
20130 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
20140 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
20150 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
20160 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
20170 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
20180 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
20190 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
201a0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
201b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
201c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
201d0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
201e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
201f0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20200 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
20210 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
20220 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
20230 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20240 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
20250 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
20260 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
20270 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
20280 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
20290 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
202a0 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
202b0 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
202c0 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
202d0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
202e0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
202f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20300 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
20310 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
20320 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
20330 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
20340 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
20350 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
20360 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
20370 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
20380 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
20390 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
203a0 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
203b0 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
203c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
203d0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
203e0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
203f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
20400 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
20410 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
20420 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
20430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
20440 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
20450 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
20460 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
20470 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
20480 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
20490 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
204a0 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
204b0 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
204c0 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
204d0 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
204e0 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
204f0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
20500 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
20510 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
20520 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
20530 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
20540 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
20550 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
20560 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
20570 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
20580 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
20590 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
205a0 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
205b0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
205c0 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
205d0 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
205e0 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
205f0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
20600 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
20610 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
20620 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
20630 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
20640 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
20650 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
20660 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
20670 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
20680 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
20690 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
206a0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
206b0 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
206c0 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
206d0 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
206e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
206f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20700 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
20710 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
20720 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
20730 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
20740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20750 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
20760 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
20770 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
20780 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41  bSize>=0 );.  PA
20790 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
207a0 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47  BEGIN %d\n", PAG
207b0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
207c0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
207d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
207e0 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Use = 1;.    pPa
207f0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
20800 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
20810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20820 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
20830 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
20840 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
20850 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
20860 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
20870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20880 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20890 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
208a0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  .  pPager->aInSt
208b0 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
208c0 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
208d0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
208e0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
208f0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71  ==0 ){.    /* sq
20900 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
20910 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
20920 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74  OCK); */.    ret
20930 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
20940 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
20950 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
20960 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
20970 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
20980 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
20990 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
209a0 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
209b0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  d;.  assert( pPa
209c0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
209d0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
209e0 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  lOff );.#endif. 
209f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
20a00 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
20a10 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
20a20 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
20a30 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
20a40 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
20a50 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
20a60 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
20a70 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
20a80 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
20a90 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
20aa0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20ab0 72 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67 65  rOpentemp(&pPage
20ac0 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
20ad0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
20ae0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
20af0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
20b00 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
20b10 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
20b20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
20b30 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
20b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20b50 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
20b60 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
20b70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
20b80 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
20b90 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
20ba0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
20bb0 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
20bc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20bd0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
20be0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
20bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
20c00 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  tCommit(Pager *p
20c10 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
20c20 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
20c30 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
20c40 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50  g, *pNext;.    P
20c50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
20c60 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
20c70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
20c80 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
20c90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20ca0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
20cb0 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
20cc0 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
20cd0 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ate(pPager->stfd
20ce0 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73  , 0); */.      s
20cf0 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
20d00 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20  r->aInStmt );.  
20d10 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
20d20 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  tmt = 0;.    }. 
20d30 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
20d40 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
20d50 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
20d60 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
20d70 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61  extStmt;.      a
20d80 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74  ssert( pPg->inSt
20d90 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  mt );.      pPg-
20da0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
20db0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
20dc0 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
20dd0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
20de0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
20df0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
20e00 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
20e10 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
20e20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20e30 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
20e40 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t);.        pHis
20e50 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
20e60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20e70 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
20e80 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
20e90 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
20ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
20eb0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  mt = 0;.  }.  pP
20ec0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
20ed0 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
20ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20ef0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
20f00 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
20f10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
20f20 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  mtRollback(Pager
20f30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
20f40 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
20f50 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
20f60 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
20f70 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
20f80 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
20f90 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
20fa0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
20fb0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
20fc0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
20fd0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
20fe0 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29  =pPg->pNextStmt)
20ff0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
21000 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
21010 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
21020 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
21030 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
21040 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
21050 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
21060 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
21070 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
21080 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
21090 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
210a0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
210b0 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
210c0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
210d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
210e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
210f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
21100 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f  Size;.      memo
21110 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
21120 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
21130 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
21140 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
21150 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
21160 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
21170 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
21180 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
21190 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
211a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
211b0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
211c0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
211d0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
211e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
211f0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
21200 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
21210 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
21220 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
21230 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67  agerFilename(Pag
21240 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21250 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
21260 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
21270 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72  * Return the dir
21280 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61  ectory of the da
21290 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
212a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
212b0 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
212c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
212d0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
212e0 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
212f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21300 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
21310 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
21320 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
21330 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
21340 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
21350 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21360 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
21370 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
21380 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
21390 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
213a0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
213b0 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
213c0 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
213d0 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
213e0 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
213f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21400 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
21410 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
21420 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
21430 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
21440 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
21450 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
21460 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
21470 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21480 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
21490 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
214a0 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
214b0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
214c0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
214d0 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
214e0 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
214f0 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
21500 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
21510 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ecArg;.}.#endif.
21520 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21530 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21540 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
21550 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
21560 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74  y pData to locat
21570 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
21580 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  file. .**.** The
21590 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
215a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
215b0 63 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e  current page pgn
215c0 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61  o. If current pa
215d0 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f  ge.** pgno is no
215e0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
215f0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
21600 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69  l, it is not wri
21610 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a  tten there by.**
21620 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
21630 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69  . The same appli
21640 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
21650 44 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f  Data refers to o
21660 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  n entry to.** th
21670 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
21680 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
21690 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64  the page refered
216a0 20 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d   to by pData rem
216b0 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
216c0 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
216d0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
216e0 77 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20  with page pData 
216f0 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
21700 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
21710 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
21720 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
21730 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
21740 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
21750 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
21760 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
21770 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
21780 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
21790 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
217a0 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
217b0 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
217c0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
217d0 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
217e0 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
217f0 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
21800 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
21810 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
21820 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
21830 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
21840 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
21850 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69  is active)..*/.i
21860 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
21870 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
21880 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
21890 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
218a0 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
218b0 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e   .  int h;.  Pgn
218c0 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
218d0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
218e0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
218f0 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
21900 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
21910 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
21920 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
21930 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
21940 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
21950 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
21960 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
21970 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
21980 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
21990 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
219a0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
219b0 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  c ){.    needSyn
219c0 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
219d0 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
219e0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b  Pg->inJournal );
219f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
21a00 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61  ->dirty );.    a
21a10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21a20 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
21a30 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
21a40 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63  from it's hash-c
21a50 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
21a60 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
21a70 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
21a80 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
21a90 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
21aa0 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
21ab0 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
21ac0 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
21ad0 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
21ae0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
21af0 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
21b00 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
21b10 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
21b20 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
21b30 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
21b40 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
21b50 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
21b60 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c  re..  */.  pPgOl
21b70 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
21b80 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
21b90 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
21ba0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
21bb0 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ld->nRef==0 );. 
21bc0 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61     unlinkHashCha
21bd0 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c  in(pPager, pPgOl
21be0 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61  d);.    makeClea
21bf0 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69  n(pPgOld);.    i
21c00 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53  f( pPgOld->needS
21c10 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
21c20 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a  ert( pPgOld->inJ
21c30 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20  ournal );.      
21c40 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
21c50 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   1;.      pPg->n
21c60 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
21c70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21c80 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
21c90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
21ca0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
21cb0 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
21cc0 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
21cd0 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
21ce0 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
21cf0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
21d00 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
21d10 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
21d20 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
21d30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
21d40 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
21d50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
21d60 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
21d70 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
21d80 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
21d90 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
21da0 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
21db0 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
21dc0 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
21dd0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
21de0 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
21df0 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
21e00 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
21e10 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
21e20 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
21e30 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
21e40 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
21e50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
21e60 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
21e70 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
21e80 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
21e90 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
21ea0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
21eb0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
21ec0 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
21ed0 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
21ee0 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
21ef0 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
21f00 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
21f10 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
21f20 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
21f30 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
21f40 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
21f50 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
21f60 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
21f70 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
21f80 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
21f90 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
21fa0 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
21fb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
21fc0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
21fd0 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
21fe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
21ff0 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
22000 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
22010 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
22020 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
22030 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
22040 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
22050 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
22060 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
22070 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
22080 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
22090 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
220a0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
220b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
220c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
220d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
220e0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
220f0 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  Hdr->needSync = 
22100 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69  1;.    pPgHdr->i
22110 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
22120 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
22130 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
22140 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
22150 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
22160 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
22170 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
22180 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22190 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
221a0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
221b0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
221c0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
221d0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
221e0 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
221f0 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
22200 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
22210 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
22220 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
22230 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
22240 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
22250 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
22260 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
22270 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
22280 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
22290 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
222a0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
222b0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
222c0 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f  (pPager?PGHDR_TO
222d0 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
222e0 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er):0);.}../*.**
222f0 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
22300 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
22310 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
22320 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
22330 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
22340 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
22350 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
22360 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
22370 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
22380 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
22390 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
223a0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
223b0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
223c0 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
223d0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
223e0 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
223f0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
22400 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
22410 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
22420 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
22430 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
22440 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
22450 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
22460 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
22470 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
22480 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
22490 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
224a0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
224b0 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
224c0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
224d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
224e0 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
224f0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
22500 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
22510 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
22520 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
22530 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
22540 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
22550 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
22560 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
22570 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
22580 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
22590 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
225a0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
225b0 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
225c0 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
225d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
225e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
225f0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
22600 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
22610 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
22620 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
22630 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
22640 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
22650 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
22660 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
22670 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
22680 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
22690 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
226a0 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
226b0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
226c0 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
226d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
226e0 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
226f0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
22700 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
22710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22720 61 67 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61  agerLockstate(Pa
22730 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
22740 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
22750 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72  LockState(pPager
22760 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->fd);.}.#endif.
22770 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
22780 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
22790 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
227a0 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
227b0 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
227c0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
227d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
227e0 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
227f0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
22800 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
22810 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
22820 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
22830 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
22840 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
22850 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
22860 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
22870 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
22880 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
22890 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
228a0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
228b0 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
228c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
228d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
228e0 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.