/ Hex Artifact Content
Login

Artifact 9a6eefc192e3922c27bc0b18914b45dc9c348ffb:


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 30  : pager.c,v 1.30
0350: 35 20 32 30 30 37 2f 30 33 2f 32 39 20 31 37 3a  5 2007/03/29 17:
0360: 32 38 3a 31 35 20 64 61 6e 69 65 6c 6b 31 39 37  28:15 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 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0d80: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0d90: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0dc0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0dd0: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0de0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0df0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0e00: 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
0e10: 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  Get() occurs, th
0e20: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0e30: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0e40: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0e50: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e60: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e70: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e80: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e90: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0ea0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0eb0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0ec0: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0ed0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0ee0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0ef0: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0f00: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f10: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f20: 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  hat sqlite_page_
0f30: 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  write() can only
0f40: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0f50: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0f60: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0f70: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0f80: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
0f90: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
0fa0: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
0fb0: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
0fc0: 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ED.).** The tran
0fd0: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
0fe0: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
0ff0: 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e 79   when before any
1000: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1010: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1020: 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74 65  base file.  Afte
1030: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
1040: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
1050: 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72 5f 63  r sqlite_pager_c
1060: 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73 74 61  ommit(), the sta
1070: 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74 6f 20  te goes back to 
1080: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f  PAGER_SHARED..*/
1090: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
10a0: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
10b0: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
10c0: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
10d0: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
10e0: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
10f0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1100: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
1110: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
1120: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
1130: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
1140: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
1150: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
1160: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1170: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20      5../*.** If 
1180: 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  the SQLITE_BUSY_
1190: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61  RESERVED_LOCK ma
11a0: 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72  cro is set to tr
11b0: 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ue at compile-ti
11c0: 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c  me,.** then fail
11d0: 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67  ed attempts to g
11e0: 65 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  et a reserved lo
11f0: 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74  ck will invoke t
1200: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1210: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66  ..** This is off
1220: 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f   by default.  To
1230: 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64   see why, consid
1240: 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
1250: 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a   scenario:.** .*
1260: 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64  * Suppose thread
1270: 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1280: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
1290: 20 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65   wants a reserve
12a0: 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61  d lock..** Threa
12b0: 64 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20  d B already has 
12c0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12d0: 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63  and wants an exc
12e0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66  lusive lock.  If
12f0: 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73  .** both threads
1300: 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72   are using their
1310: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c   busy callbacks,
1320: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c   it might be a l
1330: 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66  ong time.** be f
1340: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68  or one of the th
1350: 72 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e  reads give up an
1360: 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68  d allows the oth
1370: 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a  er to proceed..*
1380: 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72  * But if the thr
1390: 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65  ead trying to ge
13a0: 74 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c  t the reserved l
13b0: 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69  ock gives up qui
13c0: 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e  ckly.** (if it n
13d0: 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73  ever invokes its
13e0: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20   busy callback) 
13f0: 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
1400: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72  ion will be.** r
1410: 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e  esolved quickly.
1420: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1430: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1440: 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53  _LOCK.# define S
1450: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1460: 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69  VED_LOCK 0.#endi
1470: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  f../*.** This ma
1480: 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65  cro rounds value
1490: 73 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20  s up so that if 
14a0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20  the value is an 
14b0: 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73  address it.** is
14c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
14d0: 65 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61  e an address tha
14e0: 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20  t is aligned to 
14f0: 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
1500: 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ry..*/.#define F
1510: 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58  ORCE_ALIGNMENT(X
1520: 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29  )   (((X)+7)&~7)
1530: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d  ../*.** Each in-
1540: 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
1550: 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69  a page begins wi
1560: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1570: 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73   header..** This
1580: 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20   header is only 
1590: 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20  visible to this 
15a0: 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54  pager module.  T
15b0: 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64  he client.** cod
15c0: 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67  e that calls pag
15d0: 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65  er sees only the
15e0: 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
15f0: 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  ws the header..*
1600: 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65  *.** Client code
1610: 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c   should call sql
1620: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1630: 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72   on a page prior
1640: 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e   to making.** an
1650: 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  y modifications 
1660: 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  to that page.  T
1670: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71  he first time sq
1680: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1690: 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  ).** is called, 
16a0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
16b0: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77  e contents are w
16c0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16d0: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
16e0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e  nal and PgHdr.in
16f0: 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  Journal and PgHd
1700: 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73  r.needSync are s
1710: 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65  et.  Later, once
1720: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1730: 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74  page has made it
1740: 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73   onto the disk s
1750: 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65  urface, PgHdr.ne
1760: 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65  edSync.** is cle
1770: 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66  ared.  The modif
1780: 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  ied page cannot 
1790: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
17a0: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
17b0: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
17c0: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75  le until the jou
17d0: 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62  rnal pages has b
17e0: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
17f0: 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67  sk and the.** Pg
1800: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73  Hdr.needSync has
1810: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a   been cleared..*
1820: 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64  *.** The PgHdr.d
1830: 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74  irty flag is set
1840: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   when sqlite3Pag
1850: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1860: 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c  led and.** is cl
1870: 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e  eared again when
1880: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1890: 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61 63  t is written bac
18a0: 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  k to the origina
18b0: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
18c0: 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  le..*/.typedef s
18d0: 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48 64  truct PgHdr PgHd
18e0: 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72 20  r;.struct PgHdr 
18f0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1900: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1910: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1920: 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61  to which this pa
1930: 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20  ge belongs */.  
1940: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1960: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1970: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
1980: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1990: 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73  tHash, *pPrevHas
19a0: 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c  h;  /* Hash coll
19b0: 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20  ision chain for 
19c0: 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20  PgHdr.pgno */.  
19d0: 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65  PgHdr *pNextFree
19e0: 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f  , *pPrevFree;  /
19f0: 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61  * Freelist of pa
1a00: 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
1a10: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  0 */.  PgHdr *pN
1a20: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
1a30: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
1a40: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
1a50: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74    PgHdr *pNextSt
1a60: 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20  mt, *pPrevStmt; 
1a70: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65   /* List of page
1a80: 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  s in the stateme
1a90: 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nt journal */.  
1aa0: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac0: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
1ad0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
1ae0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e  urnal */.  u8 in
1af0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1b10: 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61 74  E if in the stat
1b20: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
1b30: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20   */.  u8 dirty; 
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b60: 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  we need to write
1b70: 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f   back changes */
1b80: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61    /* Sync journa
1bb0: 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  l before writing
1bc0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
1bd0: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
1be0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
1bf0: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
1c00: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
1c10: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f  is page */.  sho
1c20: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c40: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1c50: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1c60: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1c70: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1c80: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1c90: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1cc0: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1cd0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1ce0: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1cf0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1d10: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1d20: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1d30: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1d40: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1d50: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1d60: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1d70: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1d80: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1d90: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1da0: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1db0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1dc0: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1dd0: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1de0: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1df0: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e00: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1e10: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1e20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1e30: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1e50: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1e60: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1e70: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1e80: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1e90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1ea0: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1eb0: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1ec0: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1ed0: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1ee0: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1ef0: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f00: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1f10: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1f20: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1f30: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1f40: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1f50: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1f60: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
1f70: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
1f80: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
1f90: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
1fa0: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
1fb0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1fc0: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
1fd0: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
1fe0: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
1ff0: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2000: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
2010: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
2020: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
2030: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
2040: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
2050: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
2060: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2070: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2080: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
2090: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
20a0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
20b0: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
20c0: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
20d0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
20e0: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
20f0: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
2100: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
2110: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
2120: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
2130: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2140: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
2150: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
2160: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
2170: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
2180: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
2190: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
21a0: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
21b0: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
21c0: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
21d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
21e0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
21f0: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
2200: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
2210: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
2220: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
2230: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
2240: 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b    ((void*)(&(P)[
2250: 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54  1])).#define DAT
2260: 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28  A_TO_PGHDR(D)  (
2270: 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d  &((PgHdr*)(D))[-
2280: 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  1]).#define PGHD
2290: 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20  R_TO_EXTRA(G,P) 
22a0: 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a  ((void*)&((char*
22b0: 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d  )(&(G)[1]))[(P)-
22c0: 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66  >pageSize]).#def
22d0: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  ine PGHDR_TO_HIS
22e0: 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20  T(P,PGR)  \.    
22f0: 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74          ((PgHist
2300: 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26  ory*)&((char*)(&
2310: 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e  (P)[1]))[(PGR)->
2320: 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e  pageSize+(PGR)->
2330: 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20  nExtra])../*.** 
2340: 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  A open page cach
2350: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2370: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
2380: 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  ** Pager.errCode
2390: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53   may be set to S
23a0: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
23b0: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 53 51 4c  ITE_CORRUPT, SQL
23c0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 2a 2a 20  ITE_PROTOCOL.** 
23d0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20  or SQLITE_FULL. 
23e0: 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  Once one of the 
23f0: 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f  first three erro
2400: 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65  rs occurs, it pe
2410: 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73  rsists.** and is
2420: 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65   returned as the
2430: 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79   result of every
2440: 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49   major pager API
2450: 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53   call.  The.** S
2460: 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72  QLITE_FULL retur
2470: 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74  n code is slight
2480: 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74  ly different. It
2490: 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75   persists only u
24a0: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74  ntil the.** next
24b0: 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c   successful roll
24c0: 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65  back is performe
24d0: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63  d on the pager c
24e0: 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53  ache. Also,.** S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
2500: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
2510: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2520: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
2530: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49  rLookup().** API
2540: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
2550: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
2560: 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63  sfully..*/.struc
2570: 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a  t Pager {.  u8 j
2580: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
2590: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25a0: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
25b0: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
25c0: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
25d0: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
25e0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25f0: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
2600: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
2610: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2630: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
2640: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
2650: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
2660: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
2670: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2680: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
2690: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
26a0: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26c0: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
26d0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
26e0: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
26f0: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
2700: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2710: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
2720: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
2730: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
2740: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
2750: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
2760: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
2770: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
2780: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
2790: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
27a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
27b0: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
27c0: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
27d0: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
27f0: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
2800: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
2810: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
2820: 20 75 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20   u8 full_fsync; 
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2840: 55 73 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  Use F_FULLFSYNC 
2850: 77 68 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a  when available *
2860: 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20  /.  u8 state;   
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c  /* PAGER_UNLOCK,
2890: 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52   _SHARED, _RESER
28a0: 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75  VED, etc. */.  u
28b0: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
28c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
28d0: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
28e0: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
28f0: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2910: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
2920: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
2930: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2950: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
2960: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
2970: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
2980: 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65  .  u8 dirtyCache
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
29a0: 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64  * True if cached
29b0: 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e   pages have chan
29c0: 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  ged */.  u8 alwa
29d0: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
29e0: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
29f0: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
2a00: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
2a10: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a30: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
2a40: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
2a50: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
2a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a70: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
2a80: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
2a90: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
2aa0: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2ad0: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2ae0: 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a  s */.  int dbSiz
2af0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
2b20: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44  e */.  int origD
2b30: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2b40: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
2b50: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2b60: 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20  change */.  int 
2b70: 73 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20  stmtSize;       
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2b90: 6f 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  of database (in 
2ba0: 70 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62  pages) at stmt_b
2bb0: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
2bc0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2be0: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2bf0: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2c00: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2c10: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
2c20: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
2c30: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
2c40: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
2c50: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
2c60: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2c70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2c80: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2c90: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2ca0: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2cc0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2cd0: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2ce0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2cf0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d10: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2d20: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
2d30: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2d40: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2d50: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
2d60: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
2d70: 69 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20  int nMaxPage;   
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
2d90: 69 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f  igh water mark o
2da0: 66 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  f nPage */.  int
2db0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2dd0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2de0: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
2df0: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
2e00: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2e20: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2e30: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
2e40: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  ache */.  u8 *aI
2e50: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
2e60: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2e70: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2e80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2e90: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  ile */.  u8 *aIn
2ea0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
2eb0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2ec0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2ed0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2ee0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
2ef0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2f00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2f10: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2f20: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f40: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
2f50: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
2f60: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
2f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
2f80: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
2f90: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
2fa0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69   files */.  OsFi
2fb0: 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20  le *fd, *jfd;   
2fc0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2fd0: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
2fe0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
2ff0: 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65  rnal */.  OsFile
3000: 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20   *stfd;         
3010: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
3020: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
3030: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3040: 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61  urnal*/.  BusyHa
3050: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
3060: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
3070: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
3080: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64  andler */.  PgHd
3090: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
30a0: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
30b0: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
30c0: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
30d0: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
30e0: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
30f0: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
3100: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
3110: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
3120: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3130: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
3140: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
3150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3160: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
3170: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3180: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3190: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31b0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72   List of all dir
31c0: 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36  ty pages */.  i6
31d0: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
31e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
31f0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
3200: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3210: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
3220: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
3230: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
3240: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
3250: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3260: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3270: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3280: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3290: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
32a0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
32b0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
32c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
32d0: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
32e0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
32f0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
3300: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
3310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
3320: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
3330: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3340: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3360: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3370: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3380: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3390: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
33a0: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f   nHit, nMiss, nO
33b0: 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68  vfl;     /* Cach
33c0: 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c  e hits, missing,
33d0: 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f   and LRU overflo
33e0: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ws */.  int nRea
33f0: 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  d,nWrite;       
3400: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3410: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
3420: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
3430: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
3440: 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b  r)(DbPage*,int);
3450: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
3460: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
3470: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
3480: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
3490: 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20  DbPage*,int);   
34a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
34b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
34c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76  ing pages */.  v
34d0: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
34e0: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
34f0: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
3500: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
3510: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
3520: 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20  *pCodecArg;     
3530: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3540: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64  argument to xCod
3550: 65 63 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  ec() */.  int nH
3560: 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
3570: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3580: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68 20   the pager hash 
3590: 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72  table */.  PgHdr
35a0: 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20   **aHash;       
35b0: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
35c0: 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65  able to map page
35d0: 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72   number to PgHdr
35e0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
35f0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
3600: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67  MANAGEMENT.  Pag
3610: 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  er *pNext;      
3620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
3630: 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
3640: 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61 64  s in this thread
3650: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
3660: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
3670: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3680: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
3690: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
36a0: 70 20 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 69  p use */.  u32 i
36b0: 43 68 61 6e 67 65 43 6f 75 6e 74 3b 20 20 20 20  ChangeCount;    
36c0: 20 20 20 20 20 20 20 2f 2a 20 44 62 20 63 68 61         /* Db cha
36d0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge-counter for 
36e0: 77 68 69 63 68 20 63 61 63 68 65 20 69 73 20 76  which cache is v
36f0: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  alid */.  u8 doN
3700: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3710: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3720: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3730: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3740: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3750: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3760: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3770: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3780: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3790: 45 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  E */.  u8 change
37a0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
37b0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
37c0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
37d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
37e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  */.};../*.** If 
37f0: 53 51 4c 49 54 45 5f 54 45 53 54 20 69 73 20 64  SQLITE_TEST is d
3800: 65 66 69 6e 65 64 20 74 68 65 6e 20 69 6e 63 72  efined then incr
3810: 65 6d 65 6e 74 20 74 68 65 20 76 61 72 69 61 62  ement the variab
3820: 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74  le given in.** t
3830: 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23  he argument.*/.#
3840: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3850: 54 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f  T.# define TEST_
3860: 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c  INCR(x)  x++.#el
3870: 73 65 0a 23 20 64 65 66 69 6e 65 20 54 45 53 54  se.# define TEST
3880: 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64 69 66 0a  _INCR(x).#endif.
3890: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
38a0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
38b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
38c0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
38d0: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
38e0: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
38f0: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
3900: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
3910: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
3920: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
3930: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
3940: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
3950: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
3960: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
3970: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
3980: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
3990: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
39a0: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
39b0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
39c0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
39d0: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
39e0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
39f0: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
3a00: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
3a10: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
3a20: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
3a30: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
3a40: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
3a50: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
3a60: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
3a70: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
3a80: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
3a90: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
3aa0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
3ab0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
3ac0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
3ad0: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
3ae0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
3af0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
3b00: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
3b10: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
3b20: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
3b30: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
3b40: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
3b50: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
3b60: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
3b70: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
3b80: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
3b90: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
3ba0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
3bb0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
3bc0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
3bd0: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
3be0: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
3bf0: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
3c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
3c10: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
3c20: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
3c30: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
3c40: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
3c50: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
3c60: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
3c70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
3c80: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
3c90: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
3ca0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
3cb0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
3cc0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
3cd0: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
3ce0: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
3cf0: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
3d00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
3d10: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
3d20: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
3d30: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
3d40: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
3d50: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
3d60: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
3d70: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
3d80: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
3d90: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
3da0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
3db0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
3dc0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
3dd0: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
3de0: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
3df0: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
3e00: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
3e10: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
3e20: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
3e30: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
3e40: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
3e50: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
3e60: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
3e70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3e80: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
3e90: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
3ea0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
3eb0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
3ec0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
3ed0: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
3ee0: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
3ef0: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
3f00: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
3f10: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
3f20: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
3f30: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
3f40: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
3f50: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
3f60: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
3f70: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
3f80: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
3f90: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
3fa0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
3fb0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
3fc0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
3fd0: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
3fe0: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
3ff0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
4000: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
4010: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
4020: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
4030: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
4040: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
4050: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
4060: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
4070: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
4080: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
4090: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
40a0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
40b0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
40c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
40d0: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
40e0: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
40f0: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
4100: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
4110: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
4120: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
4130: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
4140: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
4150: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
4160: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
4170: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
4180: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
4190: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
41a0: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
41b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
41c0: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
41d0: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
41e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
41f0: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
4200: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
4210: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
4220: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
4230: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
4240: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
4250: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
4260: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
4270: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
4280: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
4290: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
42a0: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
42b0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
42c0: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
42d0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
42e0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
42f0: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
4300: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
4310: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
4320: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
4330: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
4340: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
4350: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
4360: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
4370: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
4380: 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67  g (for debugging
4390: 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  ) here:.*/.#ifde
43a0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
43b0: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
43c0: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
43d0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
43e0: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
43f0: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
4400: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
4410: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
4420: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
4430: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
4440: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
4450: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
4460: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
4470: 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22  %-3d total=%d\n"
4480: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f  ,.       p->pgno
4490: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
44a0: 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e  p), p->nRef, p->
44b0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20  pPager->nRef.   
44c0: 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20   );.    cnt++;  
44d0: 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f   /* Something to
44e0: 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
44f0: 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65  t on */.  }.# de
4500: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20  fine REFINFO(X) 
4510: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58   pager_refinfo(X
4520: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
4530: 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64   REFINFO(X).#end
4540: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
4550: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
4560: 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62  e pager hash tab
4570: 6c 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74  le to N.  N must
4580: 20 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f   be a power.** o
4590: 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  f two..*/.static
45a0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69   void pager_resi
45b0: 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61  ze_hash_table(Pa
45c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
45d0: 20 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61   N){.  PgHdr **a
45e0: 48 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73  Hash, *pPg;.  as
45f0: 73 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26  sert( N>0 && (N&
4600: 28 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61  (N-1))==0 );.  a
4610: 48 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Hash = sqliteMal
4620: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73  loc( sizeof(aHas
4630: 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28  h[0])*N );.  if(
4640: 20 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20   aHash==0 ){.   
4650: 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72   /* Failure to r
4660: 65 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20  ehash is not an 
4670: 65 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e  error.  It is on
4680: 6c 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ly a performance
4690: 20 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74   hit. */.    ret
46a0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
46b0: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  eFree(pPager->aH
46c0: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
46d0: 6e 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61  nHash = N;.  pPa
46e0: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61  ger->aHash = aHa
46f0: 73 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  sh;.  for(pPg=pP
4700: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
4710: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
4720: 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a  ll){.    int h;.
4730: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
4740: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  o==0 ){.      as
4750: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
4760: 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Hash==0 && pPg->
4770: 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
4780: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
4790: 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50      }.    h = pP
47a0: 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b  g->pgno & (N-1);
47b0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
47c0: 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a  ash = aHash[h];.
47d0: 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d      if( aHash[h]
47e0: 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b   ){.      aHash[
47f0: 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
4800: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  pPg;.    }.    a
4810: 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
4820: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
4830: 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  h = 0;.  }.}../*
4840: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
4850: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
4860: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
4870: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
4880: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
4890: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
48a0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
48b0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
48c0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
48d0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
48e0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
48f0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
4900: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
4910: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
4920: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
4930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
4940: 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a  d32bits(OsFile *
4950: 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  fd, u32 *pRes){.
4960: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4970: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
4980: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
4990: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
49a0: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  c));.  if( rc==S
49b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
49c0: 2a 70 52 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c  *pRes = (ac[0]<<
49d0: 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36  24) | (ac[1]<<16
49e0: 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c  ) | (ac[2]<<8) |
49f0: 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65   ac[3];.  }.  re
4a00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4a10: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4a20: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
4a30: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
4a40: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
4a50: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
4a60: 63 20 76 6f 69 64 20 70 75 74 33 32 62 69 74 73  c void put32bits
4a70: 28 63 68 61 72 20 2a 61 63 2c 20 75 33 32 20 76  (char *ac, u32 v
4a80: 61 6c 29 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28  al){.  ac[0] = (
4a90: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
4aa0: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
4ab0: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
4ac0: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
4ad0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
4ae0: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a  = val & 0xff;.}.
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 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
4b20: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
4b30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
4b40: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
4b50: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
4b60: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4b70: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
4b80: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
4b90: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
4ba0: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
4bb0: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
4bc0: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
4bd0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
4be0: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a  ite(fd, ac, 4);.
4bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
4c00: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  32-bit integer a
4c10: 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74  t offset 'offset
4c20: 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  ' from the page 
4c30: 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
4c40: 20 70 61 67 65 20 68 65 61 64 65 72 20 27 70 27   page header 'p'
4c50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
4c60: 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 50  retrieve32bits(P
4c70: 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66  gHdr *p, int off
4c80: 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  set){.  unsigned
4c90: 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20   char *ac;.  ac 
4ca0: 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68  = &((unsigned ch
4cb0: 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
4cc0: 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20  A(p))[offset];. 
4cd0: 20 72 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c   return (ac[0]<<
4ce0: 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36  24) | (ac[1]<<16
4cf0: 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c  ) | (ac[2]<<8) |
4d00: 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   ac[3];.}.../*.*
4d10: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4d20: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
4d30: 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f   when an error o
4d40: 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
4d50: 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20   pager.** code. 
4d60: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
4d70: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
4d80: 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
4d90: 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73  ucture, the.** s
4da0: 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d  econd the error-
4db0: 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
4dc0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
4dd0: 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
4de0: 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  n. .** The value
4df0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
4e00: 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
4e10: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
4e20: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
4e30: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
4e40: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
4e50: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
4e60: 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
4e70: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 2c 0a 2a  LITE_PROTOCOL,.*
4e80: 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f  * the error beco
4e90: 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20  mes persistent. 
4ea0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 41  All subsequent A
4eb0: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
4ec0: 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69   Pager.** will i
4ed0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
4ee0: 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  n the same error
4ef0: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
4f00: 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
4f10: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
4f20: 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
4f30: 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
4f40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4f50: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4f60: 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65 72  E_FULL || pPager
4f70: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4f80: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a 20 20  E_OK );.  if(.  
4f90: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55    rc2==SQLITE_FU
4fa0: 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  LL ||.    rc2==S
4fb0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
4fc0: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43     rc2==SQLITE_C
4fd0: 4f 52 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63  ORRUPT ||.    rc
4fe0: 32 3d 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  2==SQLITE_PROTOC
4ff0: 4f 4c 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  OL.  ){.    pPag
5000: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
5010: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5020: 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
5030: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
5040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
5050: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
5060: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
5070: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
5080: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
5090: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
50a0: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
50b0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  0;.  int i;.  un
50c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61  signed char *pDa
50d0: 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ta = (unsigned c
50e0: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
50f0: 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f  ATA(pPage);.  fo
5100: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
5110: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5120: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68  ; i++){.    hash
5130: 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74   = (hash+i)^pDat
5140: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
5150: 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn hash;.}../*.*
5160: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5170: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
5180: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
5190: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
51a0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
51b0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
51c0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
51d0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
51e0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
51f0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5200: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5210: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5220: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5230: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5240: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5250: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5260: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5270: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
5280: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
5290: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
52a0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
52b0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
52c0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
52d0: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
52e0: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
52f0: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
5300: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
5310: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
5320: 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  se.#define CHECK
5330: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
5340: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
5350: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
5360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
5370: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
5380: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
5390: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
53a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
53b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
53c0: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
53d0: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
53e0: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
53f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
5400: 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20  oc(). *pzMaster 
5410: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69  is.** set to poi
5420: 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79  nt at the memory
5430: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
5440: 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
5450: 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69  ler must.** sqli
5460: 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74  teFree() *pzMast
5470: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  er..**.** If no 
5480: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5490: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
54a0: 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  ent *pzMaster is
54b0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
54c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
54d0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
54e0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
54f0: 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72  rnal(OsFile *pJr
5500: 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73  nl, char **pzMas
5510: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
5520: 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34    u32 len;.  i64
5530: 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75   szJ;.  u32 cksu
5540: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e  m;.  int i;.  un
5550: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
5560: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
5570: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
5580: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
5590: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
55a0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
55b0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
55c0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
55d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
55e0: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
55f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
5600: 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c  te3OsSeek(pJrnl,
5610: 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20   szJ-16);.  if( 
5620: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5630: 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72  return rc;. .  r
5640: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5650: 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69  Jrnl, &len);.  i
5660: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5670: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5680: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5690: 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b  (pJrnl, &cksum);
56a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
56b0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
56c0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
56d0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
56e0: 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28  Magic, 8);.  if(
56f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
5700: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
5710: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
5720: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
5730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5740: 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a  sSeek(pJrnl, szJ
5750: 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20  -16-len);.  if( 
5760: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5770: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70  return rc;..  *p
5780: 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20  zMaster = (char 
5790: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c  *)sqliteMalloc(l
57a0: 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70  en+1);.  if( !*p
57b0: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  zMaster ){.    r
57c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
57d0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  EM;.  }.  rc = s
57e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
57f0: 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c  nl, *pzMaster, l
5800: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5810: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5820: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61  sqliteFree(*pzMa
5830: 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61  ster);.    *pzMa
5840: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65  ster = 0;.    re
5850: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
5860: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
5870: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
5880: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5890: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
58a0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
58b0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28  {.    cksum -= (
58c0: 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20  *pzMaster)[i];. 
58d0: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
58e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
58f0: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
5900: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
5910: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
5920: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
5930: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
5940: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
5950: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
5960: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
5970: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
5980: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
5990: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
59a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
59b0: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
59c0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
59d0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
59e0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46    */.    sqliteF
59f0: 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a  ree(*pzMaster);.
5a00: 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20      *pzMaster = 
5a10: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
5a20: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d  (*pzMaster)[len]
5a30: 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20   = '\0';.  }.   
5a40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5a50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
5a60: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ek the journal f
5a70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
5a80: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
5a90: 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65  r boundary where
5aa0: 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65   a.** journal he
5ab0: 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64  ader may be read
5ac0: 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67   or written. Pag
5ad0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  er.journalOff is
5ae0: 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a   updated with.**
5af0: 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66   the new seek of
5b00: 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  fset..**.** i.e 
5b10: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
5b20: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
5b30: 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20  Input Offset    
5b40: 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74            Output
5b50: 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d   Offset.** -----
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b80: 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20  --.** 0         
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20  0.** 512        
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5bc0: 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20  12.** 100       
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20  512.** 2000     
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c00: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
5c10: 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72  tic int seekJour
5c20: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5c30: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
5c40: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
5c50: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
5c60: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
5c70: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
5c80: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
5c90: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
5ca0: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
5cb0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
5cc0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
5cd0: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
5ce0: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
5cf0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
5d00: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
5d10: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
5d20: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5d30: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
5d40: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
5d50: 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  t;.  return sqli
5d60: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
5d70: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
5d80: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f  ournalOff);.}../
5d90: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5da0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
5db0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
5dc0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
5dd0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
5de0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
5df0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
5e00: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
5e10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
5e20: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
5e30: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
5e40: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
5e50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5e60: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
5e70: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
5e80: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
5e90: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
5ea0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
5eb0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
5ec0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
5ed0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
5ee0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
5ef0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
5f00: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
5f10: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
5f20: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
5f30: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
5f40: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
5f50: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
5f60: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
5f70: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
5f80: 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f  urnal..** .** Fo
5f90: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
5fa0: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20  AL_HDR_SZ - 24) 
5fb0: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
5fc0: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
5fd0: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
5fe0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5ff0: 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61  er){.  char zHea
6000: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6010: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20  nalMagic)+16];. 
6020: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
6030: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
6040: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ff==0 ){.    pPa
6050: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
6060: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
6070: 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  lOff;.  }..  rc 
6080: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
6090: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
60a0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
60b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
60c0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
60d0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
60e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
60f0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
6100: 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  SZ(pPager);..  /
6110: 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a  * FIX ME: .  **.
6120: 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f    ** Possibly fo
6130: 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e  r a pager not in
6140: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74   no-sync mode, t
6150: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63  he journal magic
6160: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a   should not.  **
6170: 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69   be written unti
6180: 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64  l nRec is filled
6190: 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e   in as part of n
61a0: 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  ext syncJournal(
61b0: 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ). .  **.  ** Ac
61c0: 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65  tually maybe the
61d0: 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68   whole journal h
61e0: 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20  eader should be 
61f0: 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
6200: 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54  at.  ** point. T
6210: 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e  hink about this.
6220: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a  .  */.  memcpy(z
6230: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
6240: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
6250: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
6260: 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65   /* The nRec Fie
6270: 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66  ld. 0xFFFFFFFF f
6280: 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e  or no-sync journ
6290: 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  als. */.  put32b
62a0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
62b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
62c0: 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  c)], pPager->noS
62d0: 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66  ync ? 0xffffffff
62e0: 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20   : 0);.  /* The 
62f0: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
6300: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
6310: 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f   .  sqlite3Rando
6320: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
6330: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
6340: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
6350: 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74  nit);.  put32bit
6360: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6370: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6380: 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  +4], pPager->cks
6390: 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68  umInit);.  /* Th
63a0: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
63b0: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  se size */.  put
63c0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
63d0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
63e0: 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72  agic)+8], pPager
63f0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  ->dbSize);.  /* 
6400: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
6410: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
6420: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
6430: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6440: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6450: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
6460: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
6470: 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44  .  IOTRACE(("JHD
6480: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
6490: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
64a0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a  >journalHdr, siz
64b0: 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20  eof(zHeader))). 
64c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
64d0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
64e0: 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  , zHeader, sizeo
64f0: 66 28 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20 20  f(zHeader));..  
6500: 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  /* The journal h
6510: 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77  eader has been w
6520: 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75  ritten successfu
6530: 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f  lly. Seek the jo
6540: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
6550: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
6560: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
6570: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
6580: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  or..  */.  if( r
6590: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
65a0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54      IOTRACE(("JT
65b0: 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  AIL %p %lld\n", 
65c0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
65d0: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20  journalOff-1)). 
65e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
65f0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
6600: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6610: 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66  alOff-1);.    if
6620: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6630: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
6640: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
6650: 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22  ger->jfd, "\000"
6660: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 1);.    }.  }.
6670: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6680: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
6690: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
66a0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
66b0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
66c0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
66d0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
66e0: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
66f0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
6700: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
6710: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
6720: 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  e. See comments 
6730: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
6740: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
6750: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
6760: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75  on of.** the jou
6770: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
6780: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
6790: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
67a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
67b0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
67c0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
67d0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
67e0: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
67f0: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
6800: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
6810: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
6820: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
6830: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
6840: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
6850: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6860: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
6870: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
6880: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6890: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
68a0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
68b0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
68c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
68d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
68e0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
68f0: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
6900: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
6910: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
6920: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e  nd *dbSize are n
6930: 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52  ot set.  If JOUR
6940: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
6950: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
6960: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
6970: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
6980: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
6990: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
69a0: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
69b0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
69c0: 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  r, .  i64 journa
69d0: 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e  lSize,.  u32 *pN
69e0: 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62  Rec, .  u32 *pDb
69f0: 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Size.){.  int rc
6a00: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
6a10: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
6a20: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
6a30: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
6a40: 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65  r */..  rc = see
6a50: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6a60: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
6a70: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6a80: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
6a90: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
6aa0: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
6ab0: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
6ac0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
6ad0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
6ae0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
6af0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
6b00: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6b10: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c));.  if( rc ) 
6b20: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6b30: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6b40: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6b50: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
6b60: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6b70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
6b80: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
6b90: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6ba0: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
6bb0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6bc0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6bd0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6be0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
6bf0: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
6c00: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6c10: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6c20: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69  ager->jfd, pDbSi
6c30: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
6c40: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
6c50: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
6c60: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
6c70: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
6c80: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
6c90: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6ca0: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
6cb0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
6cc0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
6cd0: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
6ce0: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
6cf0: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
6d00: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
6d10: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
6d20: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
6d30: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
6d40: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
6d50: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
6d60: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
6d70: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
6d80: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
6d90: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
6da0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6db0: 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61  jfd, (u32 *)&pPa
6dc0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6dd0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6de0: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
6df0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
6e00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6e10: 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
6e20: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
6e30: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6e40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
6e50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6e60: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
6e70: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
6e80: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
6e90: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6ea0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
6eb0: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
6ec0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
6ed0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
6ee0: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
6ef0: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
6f00: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
6f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6f20: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
6f30: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
6f40: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
6f50: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6f60: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
6f70: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
6f80: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
6f90: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
6fa0: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
6fb0: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20  t is:.**.** + 4 
6fc0: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
6fd0: 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74  PGNO..** + N byt
6fe0: 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61  es: length of ma
6ff0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7000: 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  e..** + 4 bytes:
7010: 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a   N.** + 4 bytes:
7020: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
7030: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
7040: 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f  * + 8 bytes: aJo
7050: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
7060: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
7070: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
7080: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
7090: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
70a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
70b0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  urnal name..**.*
70c0: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
70d0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
70e0: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
70f0: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
7100: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
7110: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
7120: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
7130: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
7140: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
7150: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
7160: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
7170: 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20   rc;.  int len; 
7180: 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32  .  int i; .  u32
7190: 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68   cksum = 0;.  ch
71a0: 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61  ar zBuf[sizeof(a
71b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a  JournalMagic)+2*
71c0: 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73  4];..  if( !zMas
71d0: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
71e0: 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e  etMaster) return
71f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
7200: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
7210: 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74  = 1;..  len = st
7220: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20  rlen(zMaster);. 
7230: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
7240: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
7250: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a   += zMaster[i];.
7260: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
7270: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
7280: 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
7290: 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
72a0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
72b0: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
72c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
72d0: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
72e0: 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
72f0: 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
7300: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
7310: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
7320: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
7330: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
7340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b  ){.    rc = seek
7350: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
7360: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
7370: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7380: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
7390: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
73a0: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
73b0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
73c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41  (pPager->jfd, PA
73d0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
73e0: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
73f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7400: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
7410: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
7420: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
7430: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
7440: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7450: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75  return rc;..  pu
7460: 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65  t32bits(zBuf, le
7470: 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  n);.  put32bits(
7480: 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29  &zBuf[4], cksum)
7490: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66  ;.  memcpy(&zBuf
74a0: 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  [8], aJournalMag
74b0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
74c0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63  nalMagic));.  rc
74d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
74e0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
74f0: 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a  Buf, 8+sizeof(aJ
7500: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
7510: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
7520: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
7530: 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ync;.  return rc
7540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
7550: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
7560: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
7570: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
7580: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
7590: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
75a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
75b0: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
75c0: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
75d0: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
75e0: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
75f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
7600: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
7610: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
7620: 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  Commit().** rout
7630: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
7640: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
7650: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7660: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
7670: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
7680: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
7690: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
76a0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
76b0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
76c0: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
76d0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
76e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
76f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
7700: 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  if( pPg->inStmt 
7710: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7720: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
7730: 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e  mt==0 && pPg->pN
7740: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
7750: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
7760: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
7770: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70  ->pStmt ){.    p
7780: 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50  Pager->pStmt->pP
7790: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  revStmt = pPg;. 
77a0: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53   }.  pPg->pNextS
77b0: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
77c0: 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tmt;.  pPager->p
77d0: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50  Stmt = pPg;.  pP
77e0: 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d  g->inStmt = 1;.}
77f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7800: 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
7810: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7820: 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d  Pg){.  if( !pPg-
7830: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
7840: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  ;.  if( pPg->pPr
7850: 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  evStmt ){.    as
7860: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
7870: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d  Stmt->pNextStmt=
7880: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7890: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
78a0: 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  tStmt = pPg->pNe
78b0: 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  xtStmt;.  }else{
78c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
78d0: 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d  ->pPager->pStmt=
78e0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
78f0: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d  >pPager->pStmt =
7900: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
7910: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
7920: 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20  pNextStmt ){.   
7930: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
7940: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
7950: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
7960: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
7970: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
7980: 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20  pPrevStmt;.  }. 
7990: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
79a0: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  = 0;.  pPg->pPre
79b0: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  vStmt = 0;.  pPg
79c0: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  ->inStmt = 0;.}.
79d0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
79e0: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
79f0: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
7a00: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
7a10: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
7a20: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
7a30: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
7a40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
7a50: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
7a60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7a70: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
7a80: 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50  Hdr *p;.  if( pP
7a90: 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29  ager->aHash==0 )
7aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d   return 0;.  p =
7ab0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
7ac0: 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
7ad0: 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c  Hash-1)];.  whil
7ae0: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
7af0: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
7b00: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
7b10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
7b20: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
7b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
7b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7b50: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
7b60: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7b70: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
7b80: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
7b90: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
7ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
7bb0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
7bc0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
7bd0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
7be0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54   = -1;.      IOT
7bf0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
7c00: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
7c10: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
7c20: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
7c30: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
7c40: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
7c50: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
7c60: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
7c70: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
7c80: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
7c90: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
7ca0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
7cb0: 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  le. This is a no
7cc0: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
7cd0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
7ce0: 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ered.** the erro
7cf0: 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  r-state..*/.stat
7d00: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
7d10: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
7d20: 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  ager *p){.  if( 
7d30: 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  p->errCode ) ret
7d40: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
7d50: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
7d60: 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f  ESERVED || p->jo
7d70: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
7d80: 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d    if( p->state>=
7d90: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
7da0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
7db0: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  erRollback(p);. 
7dc0: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
7dd0: 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  k(p);.  assert( 
7de0: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
7df0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
7e00: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
7e10: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
7e20: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
7e30: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
7e40: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
7e50: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
7e60: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  );.}.../*.** Unl
7e70: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
7e80: 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69   and clear the i
7e90: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
7ea0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
7eb0: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
7ec0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
7ed0: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
7ee0: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
7ef0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
7f00: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
7f10: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
7f20: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
7f30: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
7f40: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
7f50: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
7f60: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
7f70: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
7f80: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
7f90: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
7fa0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
7fb0: 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70   *pNext;.  if( p
7fc0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
7fd0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70   return;.  for(p
7fe0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
7ff0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
8000: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50  {.    pNext = pP
8010: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
8020: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
8030: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
8040: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61  pStmt = 0;.  pPa
8050: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
8060: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
8070: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
8080: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
8090: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  ;.  pPager->pAll
80a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
80b0: 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c  nHash = 0;.  sql
80c0: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
80d0: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
80e0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
80f0: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30  Pager->aHash = 0
8100: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
8110: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   = 0;.}../*.** W
8120: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
8130: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
8140: 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f  pager has the jo
8150: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
8160: 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45  and.** a RESERVE
8170: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
8180: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
8190: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
81a0: 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74  ne releases.** t
81b0: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
81c0: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
81d0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
81e0: 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a  ts place.  The j
81f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69  ournal.** file i
8200: 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c  s deleted and cl
8210: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  osed..**.** TODO
8220: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
8230: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
8240: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
8250: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
8260: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
8270: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
8280: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
8290: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
82a0: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
82b0: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
82c0: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
82d0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
82e0: 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67  _unwritelock(Pag
82f0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
8300: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
8310: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8320: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
8330: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
8340: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
8350: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
8360: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
8370: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8380: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
8390: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
83a0: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
83b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
83c0: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
83d0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
83e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
83f0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
8400: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
8410: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
8420: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
8430: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
8440: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8450: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
8460: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
8470: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
8480: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
8490: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
84a0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
84b0: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
84c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
84d0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
84e0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
84f0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8500: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8510: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
8520: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
8530: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
8540: 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
8550: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
8560: 79 20 70 61 67 65 72 20 66 69 6c 65 2c 20 74 68  y pager file, th
8570: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
8580: 69 6c 65 20 73 68 6f 75 6c 64 0a 20 20 20 20 20  ile should.     
8590: 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 63 6f   ** have been co
85a0: 6e 66 69 67 75 72 65 64 20 61 73 20 64 65 6c 65  nfigured as dele
85b0: 74 65 2d 6f 6e 2d 63 6c 6f 73 65 2e 20 4f 74 68  te-on-close. Oth
85c0: 65 72 77 69 73 65 2c 20 69 74 20 73 68 6f 75 6c  erwise, it shoul
85d0: 64 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  d still.      **
85e0: 20 62 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20   be in the file 
85f0: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 70 61 67  system. This pag
8600: 65 72 20 73 74 69 6c 6c 20 68 6f 6c 64 73 20 61  er still holds a
8610: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
8620: 61 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ater.      ** lo
8630: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
8640: 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65 72  se file, so ther
8650: 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 61  e is no chance a
8660: 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20  nother process. 
8670: 20 20 20 20 20 2a 2a 20 63 6f 75 6c 64 20 63 72       ** could cr
8680: 65 61 74 65 20 6f 72 20 72 65 6d 6f 76 65 20 61  eate or remove a
8690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
86a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
86b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 73 46  sert( sqlite3OsF
86c0: 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72  ileExists(pPager
86d0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 7c 7c 20 70  ->zJournal) || p
86e0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
86f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8700: 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
8710: 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
8720: 6f 75 72 6e 61 6c 29 20 7c 7c 20 21 70 50 61 67  ournal) || !pPag
8730: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
8740: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
8750: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
8760: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8770: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
8780: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
8790: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
87a0: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
87b0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
87c0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
87d0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
87e0: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
87f0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
8800: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
8810: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
8820: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
8830: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
8840: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
8850: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
8860: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
8870: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
8880: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8890: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
88a0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
88b0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
88c0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
88d0: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
88e0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
88f0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
8900: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
8910: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8920: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8930: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
8940: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8950: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8960: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
8970: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
8980: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
8990: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
89a0: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
89b0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
89c0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
89d0: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
89e0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
89f0: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
8a00: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
8a10: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
8a20: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
8a30: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8a40: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
8a50: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
8a60: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
8a70: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8a80: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
8a90: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
8aa0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
8ab0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
8ac0: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
8ad0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
8ae0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
8af0: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
8b00: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8b10: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8b20: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8b30: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8b40: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8b50: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8b60: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8b70: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8b80: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8b90: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8ba0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8bb0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
8bc0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
8bd0: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
8be0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
8bf0: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
8c00: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
8c10: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8c20: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8c30: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8c40: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8c50: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8c60: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8c70: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8c80: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8c90: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8ca0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8cb0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
8cc0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
8cd0: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
8ce0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
8cf0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
8d00: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
8d10: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
8d20: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
8d30: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
8d40: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
8d50: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
8d60: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8d70: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8d80: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8d90: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8da0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
8db0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
8dc0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
8dd0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
8de0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
8df0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
8e00: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
8e10: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
8e20: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
8e30: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
8e40: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
8e50: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
8e60: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8e70: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8e80: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8e90: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8ea0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
8eb0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
8ec0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
8ed0: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
8ee0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
8ef0: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
8f00: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
8f10: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8f20: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
8f30: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
8f40: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
8f50: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
8f60: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
8f70: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
8f80: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8f90: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8fa0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
8fb0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
8fc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
8fd0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
8fe0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
8ff0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
9000: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
9010: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
9020: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
9030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9040: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
9050: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
9060: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
9070: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
9080: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
9090: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
90a0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
90b0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
90c0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
90d0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
90e0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
90f0: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
9100: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
9110: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
9120: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
9130: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
9140: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
9150: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
9160: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
9170: 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b   *jfd, int useCk
9180: 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sum){.  int rc;.
9190: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
91c0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
91d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
9200: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
9210: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
9220: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9240: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
9250: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
9260: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
9270: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
9280: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
9290: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
92a0: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
92b0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
92c0: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
92d0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
92e0: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
92f0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
9300: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
9310: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
9320: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
9330: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
9340: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
9350: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
9360: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
9370: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
9380: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
9390: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
93a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
93b0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
93c0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
93d0: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
93e0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
93f0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
9400: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
9410: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
9420: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
9430: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
9440: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
9450: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
9460: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
9470: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
9480: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
9490: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
94a0: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
94b0: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
94c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
94d0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
94e0: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
94f0: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
9500: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
9510: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
9520: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
9530: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
9540: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
9550: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
9560: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
9570: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
9580: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
9590: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
95a0: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
95b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
95c0: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
95d0: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
95e0: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
95f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9600: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
9610: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
9620: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
9630: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
9640: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9650: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9660: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
9670: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
9680: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
9690: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
96a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
96b0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
96c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
96d0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
96e0: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
96f0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9700: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
9710: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9720: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
9730: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
9740: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
9750: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
9760: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
9770: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
9780: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
9790: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
97a0: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
97b0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
97c0: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
97d0: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
97e0: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
97f0: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
9800: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
9810: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9820: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
9830: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
9840: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
9850: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
9860: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
9870: 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
9880: 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
9890: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
98a0: 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
98b0: 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
98c0: 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
98d0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
98e0: 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
98f0: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
9900: 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
9910: 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
9920: 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
9930: 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
9940: 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
9950: 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
9960: 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
9970: 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
9980: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
9990: 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
99a0: 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
99b0: 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
99c0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
99d0: 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
99e0: 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
99f0: 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
9a00: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
9a10: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f  e in the main ro
9a20: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
9a30: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
9a40: 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42   if a full ROLLB
9a50: 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72  ACK occurs after
9a60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20   the statement. 
9a70: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   ** rollback the
9a80: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77   full ROLLBACK w
9a90: 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20  ill not restore 
9aa0: 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20  the page to its 
9ab0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f  original.  ** co
9ac0: 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64  ntent.  Two cond
9ad0: 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
9ae0: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
9af0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
9b00: 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31  e.  ** files. (1
9b10: 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
9b20: 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20  ust be locked.  
9b30: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
9b40: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
9b50: 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ** page content 
9b60: 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  is in the main j
9b70: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
9b80: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
9b90: 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61  s not in.  ** ca
9ba0: 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69  che or else it i
9bb0: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
9bc0: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
9bd0: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
9be0: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
9bf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9c00: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
9c10: 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
9c20: 67 21 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  g!=0 );.  PAGERT
9c30: 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20  RACE3("PLAYBACK 
9c40: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
9c50: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
9c60: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
9c70: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9c80: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
9c90: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
9ca0: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
9cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9cc0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
9cd0: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
9ce0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9cf0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9d00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9d10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9d20: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
9d30: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9d40: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9d50: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  }.    if( pPg ){
9d60: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
9d70: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
9d80: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
9d90: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
9da0: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
9db0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
9dc0: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
9dd0: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
9de0: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
9df0: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
9e00: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
9e10: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
9e20: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
9e30: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
9e40: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
9e50: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
9e60: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
9e70: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
9e80: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
9e90: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
9ea0: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
9eb0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
9ec0: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
9ed0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
9ee0: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
9ef0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
9f00: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
9f10: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
9f20: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
9f30: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
9f40: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
9f50: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9f60: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9f70: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20  xDestructor ){  
9f80: 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68  /*** FIX ME:  Sh
9f90: 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65  ould this be xRe
9fa0: 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20  init? ***/.     
9fb0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
9fc0: 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
9fd0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9fe0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9ff0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
a000: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
a010: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
a020: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
a030: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
a040: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
a050: 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 3);..    /* If
a060: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
a070: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
a080: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
a090: 72 2e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 2a  r.iChangeCount *
a0a0: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
a0b0: 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  1 ){.      pPage
a0c0: 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20  r->iChangeCount 
a0d0: 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
a0e0: 28 70 50 67 2c 20 32 34 29 3b 0a 20 20 20 20 7d  (pPg, 24);.    }
a0f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a100: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
a110: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
a120: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
a130: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a140: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
a150: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
a160: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
a170: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a180: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
a190: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
a1a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
a1b0: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
a1c0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
a1d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
a1e0: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
a1f0: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
a200: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
a210: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a220: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
a230: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
a240: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
a250: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
a260: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
a270: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
a280: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
a290: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
a2a0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
a2b0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
a2c0: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
a2d0: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
a2e0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
a2f0: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
a300: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
a310: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
a320: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a330: 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74  _delmaster(const
a340: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
a350: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
a360: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
a370: 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74  ;.  OsFile *mast
a380: 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
a390: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
a3a0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
a3b0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
a3c0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
a3d0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
a3e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
a3f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a400: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
a410: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
a420: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
a430: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
a440: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
a450: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
a460: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
a470: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
a480: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
a490: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
a4a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
a4b0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d  sOpenReadOnly(zM
a4c0: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b  aster, &master);
a4d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a4e0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
a4f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
a500: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  ter_open = 1;.  
a510: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
a520: 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26  leSize(master, &
a530: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
a540: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a550: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
a560: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
a570: 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
a580: 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
a590: 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
a5a0: 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
a5b0: 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64   0;..    /* Load
a5c0: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
a5d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a5e0: 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
a5f0: 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ned from.    ** 
a600: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
a610: 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
a620: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
a630: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
a640: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
a650: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
a660: 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
a670: 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61  l);.    if( !zMa
a680: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
a690: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a6a0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
a6b0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
a6c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
a6d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d   sqlite3OsRead(m
a6e0: 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
a6f0: 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f  urnal, nMasterJo
a700: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
a710: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a720: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a730: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
a740: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
a750: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
a760: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
a770: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
a780: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
a790: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
a7a0: 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61  leExists(zJourna
a7b0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  l) ){.        /*
a7c0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
a7d0: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
a7e0: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
a7f0: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
a800: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
a810: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
a820: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
a830: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
a840: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
a850: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
a860: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
a870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a880: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a890: 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75       OsFile *jou
a8a0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
a8b0: 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20    int c;..      
a8c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a8d0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f  OpenReadOnly(zJo
a8e0: 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29  urnal, &journal)
a8f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
a900: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a910: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
a920: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
a930: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
a940: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
a950: 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20  ournal(journal, 
a960: 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  &zMasterPtr);.  
a970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
a980: 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a  lose(&journal);.
a990: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
a9a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a9b0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
a9c0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
a9d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
a9e0: 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20  = zMasterPtr!=0 
a9f0: 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
aa00: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
aa10: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
aa20: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72  eFree(zMasterPtr
aa30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
aa40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
aa50: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
aa60: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
aa70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
aa80: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
aa90: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
aaa0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
aab0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
aac0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
aad0: 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b  trlen(zJournal)+
aae0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
aaf0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
ab00: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
ab10: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
ab20: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
ab30: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
ab40: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
ab50: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
ab60: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
ab70: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
ab80: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
ab90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
aba0: 63 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  c;.}..#if 0./*.*
abb0: 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67  * Make every pag
abc0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61  e in the cache a
abd0: 67 72 65 65 20 77 69 74 68 20 77 68 61 74 20 69  gree with what i
abe0: 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f  s on disk.  In o
abf0: 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72  ther words,.** r
ac00: 65 72 65 61 64 20 74 68 65 20 64 69 73 6b 20 74  eread the disk t
ac10: 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74  o reset the stat
ac20: 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a  e of the cache..
ac30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ac40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
ac50: 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e  er a rollback in
ac60: 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74   which some of t
ac70: 68 65 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a  he dirty cache.*
ac80: 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65 76 65  * pages had neve
ac90: 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f  r been written o
aca0: 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20  ut to disk.  We 
acb0: 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  need to roll bac
acc0: 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63  k the.** cache c
acd0: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65  ontent and the e
ace0: 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f  asiest way to do
acf0: 20 74 68 61 74 20 69 73 20 74 6f 20 72 65 72 65   that is to rere
ad00: 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65  ad the old conte
ad10: 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20  nt.** back from 
ad20: 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61  the disk..*/.sta
ad30: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65  tic int pager_re
ad40: 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65 72  load_cache(Pager
ad50: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
ad60: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
ad70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ad80: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
ad90: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
ada0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
adb0: 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d      char *zBuf =
adc0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
add0: 63 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ce;        /* Te
ade0: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 6f  mp storage for o
adf0: 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  ne page */.    i
ae00: 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29  f( !pPg->dirty )
ae10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
ae20: 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
ae30: 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
ae40: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
ae50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
ae60: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
ae70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ae80: 2a 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f  *(i64)(pPg->pgno
ae90: 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -1));.      if( 
aea0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
aeb0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
aec0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
aed0: 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
aee0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
aef0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
af00: 41 47 45 52 54 52 41 43 45 33 28 22 52 45 46 45  AGERTRACE3("REFE
af10: 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e  TCH %d page %d\n
af20: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
af30: 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
af40: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
af50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45  reak;.      CODE
af60: 43 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c  C1(pPager, zBuf,
af70: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a   pPg->pgno, 2);.
af80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
af90: 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
afa0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
afb0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
afc0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
afd0: 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50  | memcmp(zBuf, P
afe0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
aff0: 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
b000: 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  ize) ){.      me
b010: 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
b020: 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70  TA(pPg), zBuf, p
b030: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
b040: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
b050: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
b060: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
b070: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20  >xReiniter(pPg, 
b080: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b090: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b0a0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
b0b0: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
b0c0: 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70  g, pPager), 0, p
b0d0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
b0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b0f0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
b100: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  = 0;.    pPg->di
b110: 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rty = 0;.#ifdef 
b120: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
b130: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
b140: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
b150: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
b160: 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  if.  }.  pPager-
b170: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 72  >pDirty = 0;.  r
b180: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
b190: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
b1a0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
b1b0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
b1c0: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
b1d0: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
b1e0: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  dicated..*/.stat
b1f0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
b200: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
b210: 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  ger, int nPage){
b220: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b230: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
b240: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 72  EXCLUSIVE );.  r
b250: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54  eturn sqlite3OsT
b260: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
b270: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
b280: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29  Size*(i64)nPage)
b290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
b2a0: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
b2b0: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
b2c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b2d0: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
b2e0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
b2f0: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
b300: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
b310: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
b320: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
b330: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
b340: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
b350: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
b360: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
b370: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
b380: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
b390: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b3a0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b3b0: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
b3c0: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
b3d0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
b3e0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
b3f0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
b400: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
b410: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
b420: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
b430: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
b440: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
b450: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
b460: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
b470: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
b480: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
b490: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
b4a0: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
b4b0: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
b4c0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b4d0: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
b4e0: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
b4f0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
b500: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
b510: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
b520: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
b530: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
b540: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
b550: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
b560: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
b570: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
b580: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
b590: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
b5a0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
b5b0: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e  nal.).**  (6)  N
b5c0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
b5d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
b5e0: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
b5f0: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
b600: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
b610: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
b620: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
b630: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
b640: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
b650: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
b660: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
b670: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
b680: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
b690: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
b6a0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
b6b0: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
b6c0: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20  UTF-8..**  (7)  
b6d0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
b6e0: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
b6f0: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
b700: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
b710: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
b720: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
b730: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
b740: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
b750: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
b760: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
b770: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
b780: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
b790: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
b7a0: 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61   first 6 items a
b7b0: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
b7c0: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
b7d0: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
b7e0: 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65  e of the 7th ite
b7f0: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
b800: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
b810: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
b820: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
b830: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
b840: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
b850: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
b860: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
b870: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
b880: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
b890: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
b8a0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
b8b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
b8c0: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
b8d0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
b8e0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
b8f0: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
b900: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
b910: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
b920: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
b930: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
b940: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
b950: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
b960: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
b970: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
b980: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
b990: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
b9a0: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
b9b0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
b9c0: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
b9d0: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
b9e0: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
b9f0: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
ba00: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
ba10: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
ba20: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
ba30: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
ba40: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
ba50: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
ba60: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
ba70: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
ba80: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
ba90: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
baa0: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
bab0: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
bac0: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
bad0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
bae0: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
baf0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
bb00: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
bb10: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
bb20: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
bb30: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
bb40: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
bb50: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
bb60: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
bb70: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
bb80: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
bb90: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
bba0: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
bbb0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
bbc0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
bbd0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
bbe0: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
bbf0: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
bc00: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
bc10: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
bc20: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
bc30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
bc40: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
bc50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
bc60: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
bc70: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
bc80: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
bc90: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
bca0: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
bcb0: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
bcc0: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
bcd0: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
bce0: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
bcf0: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
bd00: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
bd10: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
bd20: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
bd30: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
bd40: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
bd50: 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
bd60: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
bd70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
bd80: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
bd90: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
bda0: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bdc0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
bdd0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
bde0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
be10: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
be20: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
be30: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
be40: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
be50: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
be80: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
be90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
bea0: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
beb0: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
bec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
bed0: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
bee0: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
bef0: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
bf00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
bf10: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
bf20: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
bf30: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
bf40: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
bf50: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
bf60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
bf70: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
bf80: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
bf90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bfa0: 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20  || szJ==0 ){.   
bfb0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
bfc0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
bfd0: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
bfe0: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
bff0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
c000: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
c010: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
c020: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c030: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
c040: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
c050: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
c060: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
c070: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
c080: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
c090: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
c0a0: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
c0b0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
c0c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
c0d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73  ager->jfd, &zMas
c0e0: 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ter);.  assert( 
c0f0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
c100: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c110: 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74  ITE_OK || (zMast
c120: 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73  er && !sqlite3Os
c130: 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74  FileExists(zMast
c140: 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  er)) ){.    sqli
c150: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
c160: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
c170: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
c180: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
c190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c1a0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c1b0: 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  k;.  }.  sqlite3
c1c0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
c1d0: 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72  fd, 0);.  pPager
c1e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
c1f0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
c200: 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
c210: 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
c220: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
c230: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
c240: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
c250: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
c260: 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
c270: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
c280: 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
c290: 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
c2a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
c2b0: 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
c2c0: 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
c2d0: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
c2e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
c2f0: 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
c300: 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
c310: 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
c320: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
c330: 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
c340: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
c350: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
c360: 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
c370: 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
c380: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
c390: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
c3a0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
c3b0: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
c3c0: 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
c3d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c3e0: 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
c3f0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
c400: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c410: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
c420: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
c430: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
c440: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
c450: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
c460: 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
c470: 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
c480: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
c490: 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
c4a0: 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
c4b0: 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
c4c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
c4d0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
c4e0: 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
c4f0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
c500: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
c510: 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
c520: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
c530: 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
c540: 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
c550: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
c560: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
c570: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c580: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c590: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
c5a0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
c5b0: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
c5c0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c5d0: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
c5e0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
c5f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
c600: 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
c610: 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
c620: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
c630: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
c640: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20      ** process. 
c650: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
c660: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
c670: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69 73  rnal file consis
c680: 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f 75  ts of.    ** jou
c690: 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20 6f  rnalled copies o
c6a0: 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65  f pages that nee
c6b0: 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61 63  d to be read bac
c6c0: 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  k into the cache
c6d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c6e0: 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
c6f0: 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ot ){.      nRec
c700: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
c710: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
c720: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
c730: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
c740: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
c750: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
c760: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
c770: 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
c780: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
c790: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
c7a0: 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20  o it's original 
c7b0: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
c7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
c7d0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
c7e0: 49 56 45 20 26 26 20 0a 20 20 20 20 20 20 20 20  IVE && .        
c7f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c800: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
c810: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
c820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
c830: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
c840: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69  0 || pPager->ori
c850: 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b  gDbSize==mxPg );
c860: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
c870: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
c880: 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
c890: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c8a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
c8b0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
c8c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
c8d0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
c8e0: 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xPg;.    }..    
c8f0: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
c900: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
c910: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
c920: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
c930: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
c940: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
c950: 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
c960: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
c970: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
c980: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
c990: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  jfd, 1);.      i
c9a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c9c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
c9d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
c9e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c9f0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
ca00: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
ca10: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
ca20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ca30: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
ca40: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
ca50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ca60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
ca70: 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
ca80: 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
ca90: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
caa0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cab0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
cac0: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
cad0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
cae0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
caf0: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
cb00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
cb10: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
cb20: 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
cb30: 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
cb40: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
cb50: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
cb60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
cb70: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
cb80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cb90: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
cba0: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
cbb0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
cbc0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
cbd0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
cbe0: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
cbf0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
cc00: 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
cc10: 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
cc20: 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
cc30: 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
cc40: 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
cc50: 69 66 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53  ifferent PAGER_S
cc60: 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20  ECTOR_SIZE.  ** 
cc70: 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
cc80: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
cc90: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
cca0: 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50  ocess..  */.  pP
ccb0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
ccc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
ccd0: 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
cce0: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
ccf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
cd00: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
cd10: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
cd20: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
cd30: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
cd40: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
cd50: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
cd60: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
cd70: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
cd80: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
cd90: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
cda0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
cdb0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
cdc0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
cdd0: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
cde0: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
cdf0: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
ce00: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
ce10: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
ce20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
ce30: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
ce40: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
ce50: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
ce60: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
ce70: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
ce80: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
ce90: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
cea0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
ceb0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
cec0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
ced0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
cee0: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
cef0: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
cf00: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
cf30: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
cf40: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
cf50: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
cf60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cf70: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
cf80: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
cf90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
cfa0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
cfb0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
cfc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cfd0: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
cfe0: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
cff0: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
d000: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
d010: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
d020: 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69   &os_szJ);.    i
d030: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d040: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d050: 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f    assert( szJ==o
d060: 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e  s_szJ );.  }.#en
d070: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64  dif..  /* Set hd
d080: 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f  rOff to be the o
d090: 66 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72  ffset just after
d0a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d0b0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  last journal.  *
d0c0: 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62  * page written b
d0d0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
d0e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66  journal-header f
d0f0: 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  or this statemen
d100: 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  t.  ** transacti
d110: 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20  on was written, 
d120: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
d130: 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75  e file if no jou
d140: 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72  rnal.  ** header
d150: 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20   was written..  
d160: 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50  */.  hdrOff = pP
d170: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
d180: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d190: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20  er->fullSync || 
d1a0: 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28  !hdrOff );.  if(
d1b0: 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20   !hdrOff ){.    
d1c0: 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  hdrOff = szJ;.  
d1d0: 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61  }.  .  /* Trunca
d1e0: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
d1f0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
d200: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a  inal size..  */.
d210: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
d220: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
d230: 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  SIVE ){.    rc =
d240: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
d250: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d260: 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  stmtSize);.  }. 
d270: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
d280: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
d290: 41 52 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72  ARED );.  pPager
d2a0: 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
d2b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20  r->stmtSize;..  
d2c0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
d2d0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
d2e0: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
d2f0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
d300: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
d310: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
d320: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d330: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
d340: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
d350: 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63  stfd, 0);.  nRec
d360: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
d370: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
d380: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
d390: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
d3a0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
d3b0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
d3c0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
d3d0: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
d3e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d3f0: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
d400: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
d410: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
d420: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
d430: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
d440: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
d450: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
d460: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
d470: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
d480: 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  i--){.    rc = p
d490: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
d4a0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
d4b0: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
d4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
d4d0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
d4e0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d4f0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
d500: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d510: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
d520: 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
d530: 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
d540: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
d550: 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
d560: 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
d570: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
d580: 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
d590: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
d5a0: 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
d5b0: 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
d5c0: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
d5d0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
d5e0: 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
d5f0: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
d600: 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
d610: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
d620: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
d630: 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
d640: 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
d650: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
d660: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
d670: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
d680: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
d690: 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
d6a0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
d6b0: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
d6c0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
d6d0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
d6e0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
d6f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d700: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
d710: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
d720: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
d730: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
d740: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
d750: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
d760: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
d770: 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
d780: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d790: 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
d7a0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
d7b0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d7c0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d7d0: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
d7e0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d7f0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
d800: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d810: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d820: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
d830: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
d840: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
d850: 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  ){.    u32 nJRec
d860: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
d870: 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
d880: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
d890: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
d8a0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
d8b0: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
d8c0: 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
d8d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d8e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
d8f0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d900: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
d910: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
d920: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  yback;.    }.   
d930: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
d940: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
d950: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
d960: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
d970: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
d980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
d990: 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20  i=nJRec-1; i>=0 
d9a0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
d9b0: 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d  alOff < szJ; i--
d9c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
d9d0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
d9e0: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
d9f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
da00: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
da10: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
da20: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
da30: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
da40: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
da50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
da60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
da70: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
da80: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
da90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
daa0: 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
dab0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
dac0: 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
dad0: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
dae0: 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
daf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
db00: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
db10: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
db20: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
db30: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
db40: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
db50: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
db60: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
db70: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
db80: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
db90: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
dba0: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
dbb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
dbc0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
dbd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
dbe0: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
dbf0: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
dc00: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
dc10: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
dc20: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
dc30: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
dc40: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
dc50: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
dc60: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
dc70: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
dc80: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
dc90: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
dca0: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
dcb0: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
dcc0: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
dcd0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
dce0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dcf0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
dd00: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
dd10: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
dd20: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
dd30: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
dd40: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
dd50: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
dd70: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
dd80: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
dd90: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
dda0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
ddb0: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
ddc0: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
ddd0: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
dde0: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
ddf0: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
de00: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
de10: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
de20: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
de30: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
de40: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
de50: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
de60: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
de70: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
de80: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
de90: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
dea0: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
deb0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
dec0: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
ded0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
dee0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
def0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
df00: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
df10: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
df20: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
df30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
df40: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
df50: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
df60: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
df70: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
df80: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
df90: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
dfa0: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
dfb0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
dfc0: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
dfd0: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
dfe0: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
dff0: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
e000: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
e010: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
e020: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
e030: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
e040: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
e050: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
e060: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
e070: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
e080: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
e090: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
e0a0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
e0b0: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
e0c0: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
e0d0: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
e0e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e0f0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
e100: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
e110: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
e120: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
e130: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
e140: 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
e150: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
e160: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
e170: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
e180: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
e190: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
e1a0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
e1b0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
e1c0: 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66  l_fsync = full_f
e1d0: 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67  sync;.  if( pPag
e1e0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
e1f0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
e200: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
e210: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
e220: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
e230: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
e240: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
e250: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
e260: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
e270: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
e280: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
e290: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
e2a0: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
e2b0: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
e2c0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
e2d0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
e2e0: 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
e2f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
e300: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
e310: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  le. .**.** Write
e320: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e330: 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
e340: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
e350: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
e360: 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
e370: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
e380: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53  il..**.** The OS
e390: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
e3a0: 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
e3b0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
e3c0: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73  en it is.** clos
e3d0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
e3e0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
e3f0: 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a  entemp(OsFile **
e400: 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  pFd){.  int cnt 
e410: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
e420: 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49   char zFile[SQLI
e430: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
e440: 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ];..#ifdef SQLIT
e450: 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
e460: 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
e470: 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
e480: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
e490: 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
e4a0: 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e  dif.  do{.    cn
e4b0: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t--;.    sqlite3
e4c0: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
e4d0: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
e4e0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
e4f0: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46  lusive(zFile, pF
e500: 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28  d, 1);.  }while(
e510: 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51   cnt>0 && rc!=SQ
e520: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
e530: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
e540: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e550: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
e560: 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
e570: 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
e580: 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
e590: 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
e5a0: 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
e5b0: 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
e5c0: 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
e5d0: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
e5e0: 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
e5f0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
e600: 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
e610: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
e620: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
e630: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
e640: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
e650: 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a  e3PagerUnref()..
e660: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
e670: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
e680: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
e690: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
e6a0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
e6b0: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
e6c0: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
e6d0: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
e6e0: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
e6f0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
e700: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
e710: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
e720: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
e730: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
e740: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
e750: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
e760: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
e770: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
e780: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
e790: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
e7a0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
e7b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
e7c0: 67 65 72 4f 70 65 6e 28 0a 20 20 50 61 67 65 72  gerOpen(.  Pager
e7d0: 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
e7e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
e7f0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
e800: 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
e810: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
e820: 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
e830: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e840: 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
e850: 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
e860: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
e870: 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
e880: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
e890: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
e8a0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
e8b0: 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
e8c0: 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
e8d0: 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20  e */.){.  Pager 
e8e0: 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 63  *pPager = 0;.  c
e8f0: 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
e900: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61  me = 0;.  int na
e910: 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69  meLen;  /* Compi
e920: 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54 68  ler is wrong. Th
e930: 69 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  is is always ini
e940: 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20  tialized before 
e950: 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  use */.  OsFile 
e960: 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *fd;.  int rc = 
e970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
e980: 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   i;.  int tempFi
e990: 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65  le = 0;.  int me
e9a0: 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  mDb = 0;.  int r
e9b0: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69  eadOnly = 0;.  i
e9c0: 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
e9d0: 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
e9e0: 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
e9f0: 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
ea00: 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
ea10: 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
ea20: 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  =0;.  char zTemp
ea30: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
ea40: 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53  _SIZE];.#ifdef S
ea50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
ea60: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
ea70: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63   /* A malloc() c
ea80: 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71  annot fail in sq
ea90: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
eaa0: 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ) as one or more
eab0: 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20   calls to .  ** 
eac0: 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61  malloc() must ha
ead0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
eae0: 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72  made by this thr
eaf0: 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65  ead before it ge
eb00: 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ts.  ** to this 
eb10: 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e  point. This mean
eb20: 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  s the ThreadData
eb30: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
eb40: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64  allocated alread
eb50: 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54  y.  ** so that T
eb60: 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
eb70: 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49 74 20   can be set. It 
eb80: 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20 74 6f  would be nice to
eb90: 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61   assert.  ** tha
eba0: 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c  t ThreadData.nAl
ebb0: 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  loc is non-zero,
ebc0: 20 62 75 74 20 61 6c 61 73 20 74 68 69 73 20 62   but alas this b
ebd0: 72 65 61 6b 73 20 74 65 73 74 20 63 61 73 65 73  reaks test cases
ebe0: 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
ebf0: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70 61 67  o invoke the pag
ec00: 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a  er directly..  *
ec10: 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  /.  ThreadData *
ec20: 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68  pTsd = sqlite3Th
ec30: 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73  readData();.  as
ec40: 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a 23 65  sert( pTsd );.#e
ec50: 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6d 61  ndif..  /* If ma
ec60: 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c 72 65 61  lloc() has alrea
ec70: 64 79 20 66 61 69 6c 65 64 20 72 65 74 75 72 6e  dy failed return
ec80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 42   SQLITE_NOMEM. B
ec90: 65 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a 2a 20  efore even.  ** 
eca0: 74 65 73 74 69 6e 67 20 66 6f 72 20 74 68 69 73  testing for this
ecb0: 2c 20 73 65 74 20 2a 70 70 50 61 67 65 72 20 74  , set *ppPager t
ecc0: 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20 63 61  o NULL so the ca
ecd0: 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65 20 70  ller knows the p
ece0: 61 67 65 72 0a 20 20 2a 2a 20 73 74 72 75 63 74  ager.  ** struct
ecf0: 75 72 65 20 77 61 73 20 6e 65 76 65 72 20 61 6c  ure was never al
ed00: 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f 0a 20  located. .  */. 
ed10: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20   *ppPager = 0;. 
ed20: 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c   if( sqlite3Mall
ed30: 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20  ocFailed() ){.  
ed40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed50: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d  NOMEM;.  }.  mem
ed60: 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65  set(&fd, 0, size
ed70: 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a 20 4f  of(fd));..  /* O
ed80: 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
ed90: 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c  le and set zFull
eda0: 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e  Pathname to poin
edb0: 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20  t at malloc()ed 
edc0: 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e  .  ** memory con
edd0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70  taining the comp
ede0: 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69  lete filename (i
edf0: 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .e. including th
ee00: 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20  e directory)..  
ee10: 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
ee20: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
ee30: 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  0] ){.#ifndef SQ
ee40: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
ee50: 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
ee60: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
ee70: 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
ee80: 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
ee90: 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61       zFullPathna
eea0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
eeb0: 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  p("");.    }else
eec0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
eed0: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
eee0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
eef0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
ef00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
ef10: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
ef20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ef30: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
ef40: 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rite(zFullPathna
ef50: 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e  me, &fd, &readOn
ef60: 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ly);.      }.   
ef70: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ef80: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ef90: 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a  rOpentemp(&fd);.
efa0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d      sqlite3OsTem
efb0: 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29  pFileName(zTemp)
efc0: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
efd0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75  = zTemp;.    zFu
efe0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
eff0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
f000: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
f010: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f020: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65  E_OK ){.      te
f030: 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
f040: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
f050: 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73  cate the Pager s
f060: 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72  tructure. As par
f070: 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c  t of the same al
f080: 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61  location, alloca
f090: 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  te.  ** space fo
f0a0: 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73  r the full paths
f0b0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69   of the file, di
f0c0: 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72  rectory and jour
f0d0: 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72  nal .  ** (Pager
f0e0: 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65  .zFilename, Page
f0f0: 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64  r.zDirectory and
f100: 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29   Pager.zJournal)
f110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75  ..  */.  if( zFu
f120: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
f130: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
f140: 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
f150: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
f160: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
f170: 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
f180: 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29  nameLen*3 + 30 )
f190: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
f1a0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
f1b0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
f1c0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28  r->pTmpSpace = (
f1d0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
f1e0: 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45  locRaw(SQLITE_DE
f1f0: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
f200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
f210: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
f220: 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
f230: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
f240: 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d  bove, free the m
f250: 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e  emory .  ** poin
f260: 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50  ted to by zFullP
f270: 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68  athname, free th
f280: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
f290: 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
f2a0: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63  .  ** file. Sinc
f2b0: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
f2c0: 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
f2d0: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
f2e0: 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
f2f0: 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
f300: 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
f310: 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a  f( !pPager || !z
f320: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20  FullPathname || 
f330: 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
f340: 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  ce || rc!=SQLITE
f350: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
f360: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
f370: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
f380: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f390: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
f3a0: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
f3b0: 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
f3c0: 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
f3d0: 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  rc);.  }..  PAGE
f3e0: 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64  RTRACE3("OPEN %d
f3f0: 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
f400: 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
f410: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52  athname);.  IOTR
f420: 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
f430: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75  \n", pPager, zFu
f440: 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70  llPathname)).  p
f450: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f460: 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65   = (char*)&pPage
f470: 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r[1];.  pPager->
f480: 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50  zDirectory = &pP
f490: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
f4a0: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50  nameLen+1];.  pP
f4b0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
f4c0: 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
f4d0: 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  tory[nameLen+1];
f4e0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
f4f0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75  ->zFilename, zFu
f500: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
f510: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  trcpy(pPager->zD
f520: 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50  irectory, zFullP
f530: 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72  athname);..  for
f540: 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20  (i=nameLen; i>0 
f550: 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
f560: 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
f570: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
f580: 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
f590: 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
f5a0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
f5b0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c  ->zJournal, zFul
f5c0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71  lPathname);.  sq
f5d0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f5e0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
f5f0: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
f600: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
f610: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
f620: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  ger->fd = fd;.  
f630: 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
f640: 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
f650: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
f660: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
f670: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
f680: 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
f690: 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26   = noReadlock &&
f6a0: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f6b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
f6c0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f6d0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
f6e0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f6f0: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
f700: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
f710: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
f720: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f730: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
f740: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f  T_PAGE_SIZE;.  /
f750: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
f760: 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
f770: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
f780: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f790: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
f7a0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f7b0: 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20  ->nMaxPage = 0; 
f7c0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
f7d0: 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73  age = 100;.  ass
f7e0: 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ert( PAGER_UNLOC
f7f0: 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61  K==0 );.  /* pPa
f800: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
f810: 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
f820: 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
f830: 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
f840: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
f850: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
f860: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
f870: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
f880: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
f890: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
f8a0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
f8b0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
f8c0: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
f8d0: 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
f8e0: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  al;.  pPager->fu
f8f0: 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  llSync = (pPager
f900: 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20  ->noSync?0:1);. 
f910: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
f920: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
f930: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
f940: 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
f950: 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
f960: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f970: 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
f980: 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
f990: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64 7c  a);.  assert(fd|
f9a0: 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20 21  |memDb);.  if( !
f9b0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
f9c0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
f9d0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
f9e0: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 7d 0a 20  rSize(fd);.  }. 
f9f0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
fa00: 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
fa10: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
fa20: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
fa30: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
fa40: 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
fa50: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
fa60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fa70: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
fa80: 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e  EMENT.  pPager->
fa90: 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50  pNext = pTsd->pP
faa0: 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50  ager;.  pTsd->pP
fab0: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
fac0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
fad0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fae0: 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
faf0: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
fb00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
fb10: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
fb20: 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
fb30: 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
fb40: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
fb50: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
fb60: 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
fb70: 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
fb80: 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
fb90: 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
fba0: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
fbb0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
fbc0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
fbd0: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
fbe0: 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
fbf0: 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
fc00: 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
fc10: 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
fc20: 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
fc30: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
fc40: 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
fc50: 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
fc60: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
fc70: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
fc80: 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
fc90: 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  lt sqlite3PagerC
fca0: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
fcb0: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
fcc0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
fcd0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
fce0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fcf0: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
fd00: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
fd10: 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
fd20: 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
fd30: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
fd40: 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
fd50: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
fd60: 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
fd70: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
fd80: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
fd90: 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
fda0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
fdb0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
fdc0: 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
fdd0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
fde0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
fdf0: 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
fe00: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
fe10: 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
fe20: 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
fe30: 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
fe40: 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
fe50: 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
fe60: 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
fe70: 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
fe80: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
fe90: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
fea0: 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
feb0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
fec0: 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
fed0: 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
fee0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
fef0: 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
ff00: 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
ff10: 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ize.  Return the
ff20: 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74   new size.  If t
ff30: 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
ff40: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69  age.** size is i
ff50: 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
ff60: 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
ff70: 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
ff80: 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72  elected.** and r
ff90: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
ffa0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
ffb0: 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
ffc0: 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53  Pager, int pageS
ffd0: 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
ffe0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
fff0: 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
10000 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10010 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
10020 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
10030 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
10040 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
10050 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
10060 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
10070 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  geSize;.    pPag
10080 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
10090 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72  sqlite3ReallocOr
100a0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
100b0 70 53 70 61 63 65 2c 20 70 61 67 65 53 69 7a 65  pSpace, pageSize
100c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
100d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
100e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
100f0 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
10100 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
10110 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
10120 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
10130 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
10140 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
10150 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
10160 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
10170 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
10180 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
10190 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
101a0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
101b0 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
101c0 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
101d0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
101e0 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
101f0 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
10200 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
10210 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
10220 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
10230 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
10240 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
10250 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
10260 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
10270 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f  cnt;.void clear_
10280 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10290 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  or(){.  sqlite3_
102a0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30  io_error_hit = 0
102b0 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  ;.}.void disable
102c0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
102d0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
102e0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
102f0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
10300 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
10310 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
10320 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
10330 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10340 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
10350 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10360 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
10370 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
10380 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d  define clear_sim
10390 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
103a0 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  ).# define disab
103b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
103c0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
103d0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
103e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
103f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
10400 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
10410 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
10420 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
10430 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
10440 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
10450 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
10460 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
10470 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
10480 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
10490 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
104a0 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
104b0 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
104c0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
104d0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
104e0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
104f0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
10500 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
10510 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
10520 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
10530 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
10540 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
10550 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
10560 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
10570 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
10580 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
10590 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
105a0 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
105b0 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
105c0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
105d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
105e0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
105f0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
10600 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
10610 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
10620 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10630 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
10640 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
10650 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
10660 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
10670 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
10690 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
106a0 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  0);.    enable_s
106b0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
106c0 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  rs();.    IOTRAC
106d0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
106e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
106f0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
10700 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
10710 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a  >fd, pDest, N);.
10720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10730 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
10740 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
10750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10760 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10770 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
10780 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
10790 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
107a0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
107b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
107c0 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
107d0 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
107e0 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
107f0 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
10800 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
10810 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
10820 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
10830 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
10840 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
10850 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
10860 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
10870 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
10880 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
10890 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
108a0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
108b0 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
108c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
108d0 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
108e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
108f0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
10900 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
10910 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10920 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
10930 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10940 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
10950 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
10960 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
10970 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
10980 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
10990 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
109a0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ( (rc = sqlite3O
109b0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
109c0 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
109d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
109e0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
109f0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
10a00 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10a10 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
10a20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10a30 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
10a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10a50 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
10a60 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
10a70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10a80 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
10a90 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
10aa0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
10ab0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
10ac0 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
10ad0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10ae0 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
10af0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
10b00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10b10 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
10b20 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
10b30 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
10b40 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
10b50 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
10b60 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
10b70 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
10b80 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
10b90 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
10ba0 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
10bb0 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
10bc0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
10bd0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
10be0 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
10bf0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
10c00 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
10c10 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
10c20 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
10c30 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
10c40 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
10c50 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
10c60 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
10c70 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
10c80 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
10c90 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
10ca0 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
10cb0 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
10cc0 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
10cd0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
10ce0 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
10cf0 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
10d00 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
10d10 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
10d20 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
10d30 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
10d40 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
10d50 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
10d60 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
10d70 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
10d80 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
10d90 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
10da0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
10db0 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
10dc0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
10dd0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
10de0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
10df0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
10e00 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
10e10 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
10e20 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
10e30 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
10e40 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
10e50 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
10e60 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
10e70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
10e80 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
10e90 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
10ea0 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
10eb0 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
10ec0 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
10ed0 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
10ee0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
10ef0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
10f00 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
10f10 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
10f20 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
10f30 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
10f40 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
10f50 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
10f60 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
10f70 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
10f80 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
10f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
10fa0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10fb0 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
10fc0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
10fd0 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
10fe0 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
10ff0 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
11000 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
11010 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
11020 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
11030 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
11040 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
11050 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
11060 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
11070 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
11080 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
11090 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
110a0 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
110b0 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
110c0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
110d0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
110e0 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
110f0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
11100 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
11110 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
11120 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
11130 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
11140 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
11150 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
11160 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
11170 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
11180 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
11190 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
111a0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
111b0 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
111c0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
111d0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
111e0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
111f0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
11200 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
11210 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11220 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11230 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
11240 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11250 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
11260 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
11270 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11280 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
11290 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
112a0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
112b0 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
112c0 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
112d0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
112e0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
112f0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
11300 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11310 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
11320 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11330 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
11340 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
11350 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
11360 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
11370 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
11380 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
11390 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
113a0 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
113b0 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
113c0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
113d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
113e0 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
113f0 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
11400 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
11410 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11420 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
11430 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
11440 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
11450 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
11460 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
11470 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
11480 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
11490 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
114a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
114b0 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
114c0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
114d0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
114e0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
114f0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
11500 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
11510 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
11520 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
11530 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
11540 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
11550 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
11560 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
11570 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
11580 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
11590 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
115a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
115b0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
115c0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
115d0 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  e memoryTruncate
115e0 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (p).#endif../*.*
115f0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
11600 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
11610 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
11620 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
11630 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
11640 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
11650 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
11660 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
11670 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
11680 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
11690 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
116a0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
116b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
116c0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
116d0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
116e0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
116f0 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
11700 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
11710 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
11720 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
11730 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
11740 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
11750 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
11760 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
11770 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
11780 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
11790 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
117a0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
117b0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
117c0 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
117d0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
117e0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
117f0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
11800 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
11810 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
11820 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
11830 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
11840 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
11850 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11860 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11870 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
11880 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
11890 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
118a0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
118b0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
118c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
118d0 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
118e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
118f0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
11900 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
11910 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
11920 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
11930 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
11940 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
11950 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
11960 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
11980 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
11990 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
119a0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
119b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
119c0 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
119d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
119e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
119f0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
11a00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
11a10 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
11a20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11a30 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
11a40 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
11a50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
11a60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11a70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11a80 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
11a90 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11aa0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
11ab0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
11ac0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
11ad0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
11ae0 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
11af0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
11b00 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
11b10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
11b20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11b30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
11b40 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
11b50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
11b60 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
11b70 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
11b80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11b90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
11ba0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
11bb0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
11bc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11bd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11be0 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
11bf0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
11c00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
11c10 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
11c20 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
11c30 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
11c40 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
11c50 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
11c60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11c70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11c80 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
11c90 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11ca0 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   nPage);.  if( r
11cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11cc0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
11cd0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ze = nPage;.  }.
11ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11cf0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
11d00 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
11d10 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
11d20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
11d30 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
11d40 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11d50 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
11d60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11d70 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
11d80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
11d90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
11da0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
11db0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
11dc0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
11dd0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
11de0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
11df0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
11e00 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
11e10 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
11e20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
11e30 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
11e40 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
11e50 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
11e60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
11e70 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
11e80 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
11e90 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
11ea0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
11eb0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
11ec0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
11ed0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
11ee0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
11ef0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
11f00 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
11f10 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
11f20 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
11f30 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
11f40 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
11f50 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
11f60 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
11f70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
11f80 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
11f90 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
11fa0 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
11fb0 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
11fc0 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
11fd0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
11fe0 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
11ff0 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
12000 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
12010 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
12020 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
12030 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
12040 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
12050 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
12060 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
12070 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
12080 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
12090 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
120a0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54  be set..  */.  T
120b0 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
120c0 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
120d0 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
120e0 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73   pPager );.  ass
120f0 65 72 74 28 20 70 54 73 64 20 26 26 20 70 54 73  ert( pTsd && pTs
12100 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e  d->nAlloc );.#en
12110 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73  dif..  disable_s
12120 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12130 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rs();.  pPager->
12140 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
12150 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
12160 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
12170 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12180 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
12190 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
121a0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
121b0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
121c0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
121d0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
121e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
121f0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
12200 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
12210 29 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  )).  assert( pPa
12220 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12230 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
12240 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65  Open==0 && pPage
12250 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20  r->stmtOpen==0) 
12260 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
12270 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
12280 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12290 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
122a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
122b0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
122c0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
122d0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
122e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
122f0 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
12300 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
12310 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
12320 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
12330 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
12340 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
12350 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
12360 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
12370 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
12380 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12390 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
123a0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
123b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
123c0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
123d0 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
123e0 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
123f0 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
12400 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
12410 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54  rting at .  ** T
12420 68 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72  hreadData.pPager
12430 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   if memory-manag
12440 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
12450 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12460 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65  ger==pTsd->pPage
12470 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70  r ){.    pTsd->p
12480 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  Pager = pPager->
12490 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
124a0 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b      Pager *pTmp;
124b0 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20  .    for(pTmp = 
124c0 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54  pTsd->pPager; pT
124d0 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65  mp->pNext!=pPage
124e0 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  r; pTmp=pTmp->pN
124f0 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d  ext){}.    pTmp-
12500 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d  >pNext = pPager-
12510 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64  >pNext;.  }.#end
12520 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  if.  sqliteFree(
12530 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
12540 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
12550 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
12560 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
12570 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
12580 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12590 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
125a0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
125b0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
125c0 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
125d0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
125e0 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
125f0 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
12600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
12610 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
12620 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
12630 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
12640 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
12650 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
12660 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
12670 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
12680 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
12690 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
126a0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
126b0 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
126c0 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
126d0 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
126e0 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
126f0 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
12700 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
12710 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
12720 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
12730 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
12740 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
12750 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
12760 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
12770 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
12780 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
12790 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
127a0 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
127b0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
127c0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
127d0 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
127e0 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
127f0 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
12800 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
12810 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65   pPg==pPg->pPage
12820 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
12830 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
12840 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
12850 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ee;.      while(
12860 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
12870 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
12880 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70  tFree; }.      p
12890 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
128a0 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
128b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
128c0 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
128d0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
128e0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
128f0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
12900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12910 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
12920 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
12930 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
12940 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
12950 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
12960 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
12970 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
12980 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
12990 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
129a0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
129b0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
129c0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
129d0 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
129e0 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
129f0 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
12a00 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
12a10 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
12a20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
12a30 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
12a40 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12a50 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
12a60 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
12a70 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
12a80 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
12a90 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
12aa0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
12ab0 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
12ac0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
12ad0 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
12ae0 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
12af0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
12b00 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
12b10 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
12b20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
12b30 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
12b40 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
12b50 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
12b60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12b70 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
12b80 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  g){.  page_ref(p
12b90 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
12ba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12bb0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
12bc0 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
12bd0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
12be0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
12bf0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
12c00 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
12c10 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
12c20 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
12c30 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
12c40 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
12c50 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
12c60 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
12c70 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
12c80 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
12c90 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
12ca0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
12cb0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
12cc0 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
12cd0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
12ce0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
12cf0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
12d00 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
12d10 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
12d20 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
12d30 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
12d40 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
12d50 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
12d60 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
12d70 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
12d80 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
12d90 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
12da0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12db0 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
12dc0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12dd0 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
12de0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
12df0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
12e00 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
12e10 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
12e20 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
12e30 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
12e40 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
12e50 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
12e60 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
12e70 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
12e80 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
12e90 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
12ea0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
12eb0 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
12ec0 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
12ed0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
12ee0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
12ef0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
12f00 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
12f10 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
12f20 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
12f30 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
12f40 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12f50 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
12f60 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
12f70 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
12f80 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
12f90 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
12fa0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
12fb0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
12fc0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
12fd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12fe0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
12ff0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
13000 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
13010 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
13020 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
13030 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
13040 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
13050 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
13060 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
13070 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
13080 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
13090 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
130a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
130b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
130c0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
130d0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
130e0 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
130f0 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
13100 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
13110 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
13120 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
13130 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
13140 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
13150 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
13160 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
13170 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13180 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
13190 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
131a0 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
131b0 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
131c0 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
131d0 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
131e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
131f0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
13200 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
13210 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13220 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
13230 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
13240 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
13250 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
13260 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
13270 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13280 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
13290 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
132a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
132b0 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
132c0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
132d0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
132e0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
132f0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
13300 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
13310 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
13320 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
13330 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
13340 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
13350 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
13360 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
13370 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
13380 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
13390 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
133a0 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
133b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
133c0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
133d0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
133e0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
133f0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
13400 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13410 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
13420 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
13430 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
13440 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13450 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13460 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
13470 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
13480 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
13490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
134a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
134b0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
134c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
134e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
134f0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
13500 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
13510 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13520 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f  n rc;.        IO
13530 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
13540 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
13550 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
13560 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13570 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
13580 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
13590 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63  , 4)).        rc
135a0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
135b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
135c0 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
135d0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
135e0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
135f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
13600 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
13610 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13620 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
13630 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
13650 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
13660 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
13670 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
13680 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
13690 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22  CE(("JSYNC %d\n"
136a0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
136b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
136c0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
136d0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
136e0 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ync);.      if( 
136f0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
13700 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
13710 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
13720 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
13730 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
13740 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
13750 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
13760 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
13770 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
13780 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
13790 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
137a0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
137b0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
137c0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
137d0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
137e0 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
137f0 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
13800 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13810 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
13820 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
13830 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
13840 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
13850 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
13860 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
13870 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
13880 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
13890 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
138a0 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
138b0 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
138c0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
138d0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
138e0 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
138f0 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
13900 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
13910 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13920 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
13930 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
13940 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
13950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13960 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
13970 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
13980 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
13990 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
139a0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
139b0 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
139c0 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
139d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
139e0 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
139f0 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
13a00 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
13a10 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
13a20 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
13a30 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
13a40 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
13a50 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
13a60 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
13a70 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
13a80 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
13a90 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
13aa0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
13ab0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
13ac0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
13ad0 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
13ae0 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
13af0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
13b00 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
13b10 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13b20 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
13b30 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
13b40 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
13b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
13b60 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
13b70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
13b80 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
13b90 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
13ba0 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
13bb0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
13bc0 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
13bd0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
13be0 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
13bf0 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
13c00 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
13c10 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
13c20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
13c30 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
13c40 4b 45 54 20 32 35 0a 73 74 61 74 69 63 20 50 67  KET 25.static Pg
13c50 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69  Hdr *sort_pageli
13c60 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a  st(PgHdr *pIn){.
13c70 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52    PgHdr *a[N_SOR
13c80 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0a 20  T_BUCKET], *p;. 
13c90 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74   int i;.  memset
13ca0 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29  (a, 0, sizeof(a)
13cb0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20  );.  while( pIn 
13cc0 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a  ){.    p = pIn;.
13cd0 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69      pIn = p->pDi
13ce0 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
13cf0 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ty = 0;.    for(
13d00 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=0; i<N_SORT_BU
13d10 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  CKET-1; i++){.  
13d20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20      if( a[i]==0 
13d30 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  ){.        a[i] 
13d40 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = p;.        bre
13d50 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
13d60 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72  .        p = mer
13d70 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
13d80 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b  , p);.        a[
13d90 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
13da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
13db0 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  =N_SORT_BUCKET-1
13dc0 20 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d   ){.      a[i] =
13dd0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13de0 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  a[i], p);.    }.
13df0 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a    }.  p = a[0];.
13e00 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53    for(i=1; i<N_S
13e10 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29  ORT_BUCKET; i++)
13e20 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f  {.    p = merge_
13e30 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d  pagelist(p, a[i]
13e40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13e50 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
13e60 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
13e70 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
13e80 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
13e90 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
13ea0 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
13eb0 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
13ec0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13ed0 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
13ee0 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
13ef0 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
13f00 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
13f10 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
13f20 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
13f30 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
13f40 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
13f50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13f60 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
13f70 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
13f80 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
13f90 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
13fa0 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
13fb0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
13fc0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
13fd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
13fe0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
13ff0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
14000 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
14010 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
14020 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
14030 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
14040 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
14050 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
14060 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
14070 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
14080 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
14090 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
140a0 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
140b0 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
140c0 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
140d0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
140e0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
140f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14100 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
14110 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
14120 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
14130 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
14140 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
14150 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
14160 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
14170 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
14180 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
14190 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
141a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
141b0 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
141c0 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
141d0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
141e0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
141f0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
14200 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
14210 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
14220 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
14230 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
14240 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
14250 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
14260 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
14270 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
14280 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
14290 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
142a0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
142b0 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
142c0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
142d0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
142e0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
142f0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
14300 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
14310 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
14320 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
14330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14350 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
14360 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
14370 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
14380 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14390 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
143a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
143b0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
143c0 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
143d0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
143e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
143f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
14400 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ;.    /* If ther
14410 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
14420 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
14430 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
14440 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
14450 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
14460 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
14470 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
14480 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
14490 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
144a0 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
144b0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
144c0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
144d0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
144e0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
144f0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
14500 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14510 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
14520 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
14530 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
14540 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28  *pData = CODEC2(
14550 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
14560 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
14570 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
14580 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
14590 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
145a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
145b0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
145c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  gno);.      IOTR
145d0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
145e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
145f0 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  ist->pgno)).    
14600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14610 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
14620 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
14630 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14640 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
14650 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
14660 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
14670 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
14680 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
14690 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
146a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
146b0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
146c0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
146d0 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
146e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c  eturn rc;.    pL
146f0 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  ist->dirty = 0;.
14700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
14710 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c  ECK_PAGES.    pL
14720 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  ist->pageHash = 
14730 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
14740 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  List);.#endif.  
14750 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
14760 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
14770 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
14790 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
147a0 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
147b0 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
147c0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
147d0 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
147e0 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
147f0 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
14800 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
14810 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
14820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
14830 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
14840 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
14850 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
14860 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44  eturn pPager->pD
14870 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
14880 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
14890 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
148a0 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
148b0 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
148c0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
148d0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
148e0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
148f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
14900 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
14910 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
14920 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
14930 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
14940 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
14950 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
14960 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
14970 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
14980 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
14990 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
149a0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
149b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
149c0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
149d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
149e0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65  if( !pPager->use
149f0 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  Journal ) return
14a00 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
14a10 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
14a20 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
14a30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14a40 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  f( sqlite3OsChec
14a50 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
14a60 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75  ager->fd) ) retu
14a70 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
14a80 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
14a90 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
14aa0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
14ab0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
14ac0 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  rnal);.    retur
14ad0 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
14ae0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
14af0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
14b00 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
14b10 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61  he cache that ca
14b20 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a  n be recycled. .
14b30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14b40 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ne may return SQ
14b50 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
14b60 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54  TE_FULL or SQLIT
14b70 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65  E_OK. It .** doe
14b80 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50  s not set the pP
14b90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61  ager->errCode va
14ba0 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
14bb0 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79  c int pager_recy
14bc0 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  cle(Pager *pPage
14bd0 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50  r, int syncOk, P
14be0 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
14bf0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
14c00 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  pPg = 0;..  /* F
14c10 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
14c20 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
14c30 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
14c40 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
14c50 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
14c60 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
14c70 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
14c80 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
14c90 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
14ca0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
14cb0 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
14cc0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
14cd0 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
14ce0 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
14cf0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
14d00 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
14d10 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
14d20 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
14d30 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
14d40 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
14d50 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
14d60 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
14d70 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
14d80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
14d90 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
14da0 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20  First && syncOk 
14db0 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20  && !MEMDB){.    
14dc0 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
14dd0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
14de0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
14df0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14e00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
14e10 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
14e20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
14e30 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
14e40 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
14e50 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
14e60 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
14e70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
14e80 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
14e90 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
14ea0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
14eb0 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
14ec0 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
14ed0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
14ee0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
14ef0 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
14f00 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
14f10 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
14f20 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
14f30 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
14f40 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
14f50 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
14f60 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
14f70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
14f80 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
14f90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
14fa0 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
14fb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14fc0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
14fd0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
14fe0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
14ff0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
15000 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
15010 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15020 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15030 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
15040 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
15050 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
15060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15070 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
15080 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
15090 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
150a0 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
150b0 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
150c0 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
150d0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
150e0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
150f0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
15100 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
15110 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
15120 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  );.    pPg->dirt
15130 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
15140 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
15150 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
15160 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
15170 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
15180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15190 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
151a0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
151b0 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
151c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
151d0 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
151e0 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
151f0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
15200 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74   then.  ** set t
15210 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
15220 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
15230 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
15240 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f  e.  ** sqlite_do
15250 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
15260 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
15270 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
15280 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
15290 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
152a0 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
152b0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
152c0 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
152d0 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
152e0 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
152f0 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
15300 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
15310 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
15320 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
15330 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
15340 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
15350 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
15360 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
15370 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
15380 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
15390 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
153a0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
153b0 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
153c0 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53  IOTRACE(("ALWAYS
153d0 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c  _ROLLBACK %p\n",
153e0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50   pPager)).    pP
153f0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
15400 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  back = 1;.  }.. 
15410 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
15420 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
15430 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
15440 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
15450 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28  */.  unlinkPage(
15460 70 50 67 29 3b 0a 20 20 54 45 53 54 5f 49 4e 43  pPg);.  TEST_INC
15470 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29  R(pPager->nOvfl)
15480 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
15490 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
154a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
154b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
154c0 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73  called to free s
154d0 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d  uperfluous dynam
154e0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
154f0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20   memory.** held 
15500 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73  by the pager sys
15510 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75  tem. Memory in u
15520 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65  se by any SQLite
15530 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64   pager allocated
15540 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65  .** by the curre
15550 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65  nt thread may be
15560 20 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e   sqliteFree()ed.
15570 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74  .**.** nReq is t
15580 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15590 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71  es of memory req
155a0 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73  uired. Once this
155b0 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65   much has.** bee
155c0 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20  n released, the 
155d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
155e0 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c  . A negative val
155f0 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e  ue for nReq mean
15600 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63  s.** free as muc
15610 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
15620 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e  ible. The return
15630 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f   value is the to
15640 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  tal number .** o
15650 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
15660 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23  y released..*/.#
15670 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15680 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
15690 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65  EMENT.int sqlite
156a0 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d  3PagerReleaseMem
156b0 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20  ory(int nReq){. 
156c0 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
156d0 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69  a *pTsdro = sqli
156e0 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
156f0 64 4f 6e 6c 79 28 29 3b 0a 20 20 50 61 67 65 72  dOnly();.  Pager
15700 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65   *p;.  int nRele
15710 61 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ased = 0;.  int 
15720 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  i;..  /* If the 
15730 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
15740 20 69 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73   is held, this s
15750 75 62 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65  ubroutine become
15760 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a  s a.  ** o-op; z
15770 65 72 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  ero bytes of mem
15780 6f 72 79 20 61 72 65 20 66 72 65 65 64 2e 20 20  ory are freed.  
15790 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 0a  This is because.
157a0 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65    ** some of the
157b0 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79   code invoked by
157c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
157d0 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79  ay also.  ** try
157e0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d   to obtain the m
157f0 75 74 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20  utex, resulting 
15800 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20  in a deadlock.. 
15810 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
15820 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b  3OsInMutex(0) ){
15830 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
15840 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f   }..  /* Outermo
15850 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72  st loop runs for
15860 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65   at most two ite
15870 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69  rations. First i
15880 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a  teration we.  **
15890 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d   try to find mem
158a0 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ory that can be 
158b0 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74  released without
158c0 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29   calling fsync()
158d0 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74  . Second.  ** it
158e0 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f  eration (which o
158f0 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65 20  nly runs if the 
15900 66 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20  first failed to 
15910 66 72 65 65 20 6e 52 65 71 20 62 79 74 65 73 20  free nReq bytes 
15920 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20  of.  ** memory) 
15930 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20  is permitted to 
15940 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68  call fsync(). Th
15950 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20  is is of course 
15960 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20  much more .  ** 
15970 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a  expensive..  */.
15980 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b    for(i=0; i<=1;
15990 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c   i++){..    /* L
159a0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
159b0 74 68 65 20 53 51 4c 69 74 65 20 70 61 67 65 72  the SQLite pager
159c0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
159d0 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20  current thread. 
159e0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 73  */.    for(p=pTs
159f0 64 72 6f 2d 3e 70 50 61 67 65 72 3b 20 70 20 26  dro->pPager; p &
15a00 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65  & (nReq<0 || nRe
15a10 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 3d  leased<nReq); p=
15a20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
15a30 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
15a40 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
15a50 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61    /* For each pa
15a60 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65  ger, try to free
15a70 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61   as many pages a
15a80 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68  s possible (with
15a90 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  out .      ** ca
15aa0 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66  lling fsync() if
15ab0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
15ac0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
15ad0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20  the outermost . 
15ae0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20       ** loop).. 
15af0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68       */.      wh
15b00 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ile( SQLITE_OK==
15b10 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79  (rc = pager_recy
15b20 63 6c 65 28 70 2c 20 69 2c 20 26 70 50 67 29 29  cle(p, i, &pPg))
15b30 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20   && pPg) {.     
15b40 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e     /* We've foun
15b50 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65  d a page to free
15b60 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
15b70 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
15b80 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  n .        ** re
15b90 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
15ba0 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20  age hash-table, 
15bb0 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79  free-list and sy
15bc0 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20  nced-list .     
15bd0 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e     ** (pFirstSyn
15be0 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c  ced). It is stil
15bf0 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67  l in the all pag
15c00 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20  es (pAll) list. 
15c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f  .        ** Remo
15c20 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20  ve it from this 
15c30 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65  list before free
15c40 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing..        **.
15c50 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a          ** Todo:
15c60 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72   Check the Pager
15c70 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d  .pStmt list to m
15c80 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73  ake sure this is
15c90 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20   Ok. It .       
15ca0 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20   ** probably is 
15cb0 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20  though..        
15cc0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  */.        PgHdr
15cd0 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20   *pTmp;.        
15ce0 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20  assert( pPg );. 
15cf0 20 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f         page_remo
15d00 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
15d10 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  t(pPg);.        
15d20 69 66 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c  if( pPg==p->pAll
15d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
15d40 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  ->pAll = pPg->pN
15d50 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20  extAll;.        
15d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15d70 20 66 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70 41   for( pTmp=p->pA
15d80 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41  ll; pTmp->pNextA
15d90 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54  ll!=pPg; pTmp=pT
15da0 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d  mp->pNextAll ){}
15db0 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d  .          pTmp-
15dc0 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d  >pNextAll = pPg-
15dd0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
15de0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 52 65     }.        nRe
15df0 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69 74 65  leased += sqlite
15e00 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a  AllocSize(pPg);.
15e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
15e20 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ee(pPg);.      }
15e30 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
15e40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e50 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
15e60 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
15e70 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
15e80 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
15e90 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
15ea0 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63  nal in pager_rec
15eb0 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f  ycle(). The erro
15ec0 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65  r is not returne
15ed0 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20  d to the .      
15ee0 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74    ** caller of t
15ef0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  his function. In
15f00 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50  stead, set the P
15f10 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72  ager.errCode var
15f20 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a  iable..        *
15f30 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c  * The error will
15f40 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
15f50 74 68 65 20 75 73 65 72 20 28 6f 72 20 75 73 65  the user (or use
15f60 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20  rs, in the case 
15f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
15f80 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
15f90 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65  che) of the page
15fa0 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
15fb0 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20  error occured.. 
15fc0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15fd0 20 20 61 73 73 65 72 74 28 20 28 72 63 26 30 78    assert( (rc&0x
15fe0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
15ff0 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  R || rc==SQLITE_
16000 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  FULL );.        
16010 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
16020 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
16030 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65   );.        page
16040 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a  r_error(p, rc);.
16050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16060 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c  }..  return nRel
16070 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20  eased;.}.#endif 
16080 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
16090 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
160a0 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  NT */../*.** Thi
160b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
160c0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  lled to obtain t
160d0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72  he shared lock r
160e0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a  equired before.*
160f0 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65  * data may be re
16100 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
16110 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
16120 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20  shared lock has 
16130 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
16140 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66  obtained, this f
16150 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
16160 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
16170 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  t pagerSharedLoc
16180 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
16190 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
161a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
161b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
161c0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
161d0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
161e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
161f0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ager->nRef==0 );
16200 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
16210 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
16220 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
16230 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
16240 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
16250 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
16260 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16270 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16280 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
16290 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
162a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
162b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
162c0 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
162d0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
162e0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20   .      /* If a 
162f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
16300 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
16310 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
16320 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  ck on the.      
16330 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16340 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
16350 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
16360 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
16370 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
16380 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f      if( hasHotJo
16390 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b  urnal(pPager) ){
163a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
163b0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
163c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
163d0 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
163e0 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
163f0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
16400 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
16410 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
16420 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
16430 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
16440 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
16450 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
16460 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
16470 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
16480 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
16490 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
164a0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
164b0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
164c0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  hat the.        
164d0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
164e0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
164f0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
16500 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
16510 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  it .        ** b
16520 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ack..        ** 
16530 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61  .        ** Beca
16540 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
16550 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
16560 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
16570 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ted, the.       
16580 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65   ** second proce
16590 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74  ss will get to t
165a0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
165b0 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
165c0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74  o.        ** obt
165d0 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43  ain it's own EXC
165e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
165f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16600 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
16610 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16620 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
16630 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
16640 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
16650 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16660 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
16670 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
16680 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16690 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
166a0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
166b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
166c0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
166d0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
166e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
166f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
16700 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20   reading only.  
16710 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  Return SQLITE_BU
16720 53 59 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  SY if.        **
16730 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
16740 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
16750 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
16760 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
16770 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
16780 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
16790 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65  o be locked itse
167a0 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  lf.  The.       
167b0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
167c0 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
167d0 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
167e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
167f0 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ds.        ** a 
16800 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74  write lock, so t
16810 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
16820 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20  y chance of two 
16830 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20  or more.        
16840 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65  ** processes ope
16850 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
16860 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
16870 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a  e..        **..*
16880 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
16890 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
168a0 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
168b0 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 09 2a  s because in ..*
168c0 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  * exclusive-acce
168d0 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
168e0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
168f0 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   be kept open an
16900 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73  d.        ** pos
16910 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
16920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
16930 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
16940 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
16950 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
16960 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
16970 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
16980 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
16990 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ires.        ** 
169a0 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
169b0 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
169c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
169d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
169e0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
169f0 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
16a00 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
16a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
16a20 74 20 72 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  t ro;.          
16a30 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
16a40 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
16a50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16a60 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
16a70 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
16a80 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
16a90 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20 20 20  d, &ro);.       
16aa0 20 20 20 69 66 28 20 72 6f 20 29 7b 0a 20 20 20     if( ro ){.   
16ab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
16ac0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16af0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16b00 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
16b10 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
16b20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
16b30 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
16b40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
16b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16b60 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
16b70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
16b80 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
16b90 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
16ba0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
16bb0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
16bc0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
16bd0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
16be0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
16bf0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
16c00 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
16c10 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
16c20 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
16c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
16c40 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
16c50 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
16c60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16c70 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
16c80 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
16c90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16cb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
16cc0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
16cd0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
16ce0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
16cf0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
16d00 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
16d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
16d20 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
16d30 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
16d40 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
16d50 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
16d60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
16d70 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
16d80 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
16d90 70 50 61 67 65 31 20 3d 20 70 61 67 65 72 5f 6c  pPage1 = pager_l
16da0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
16db0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
16dc0 61 67 65 31 20 29 7b 0a 20 20 20 20 20 20 20 20  age1 ){.        
16dd0 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
16de0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 31  n(pPager, pPage1
16df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
16e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16e10 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
16e20 65 72 2c 20 31 29 20 29 3b 0a 20 20 20 20 20 20  er, 1) );.      
16e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16e40 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
16e50 72 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  r, 1, &pPage1, 0
16e60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16e80 09 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67 65  .  /* The change
16e90 2d 63 6f 75 6e 74 65 72 20 69 73 20 73 74 6f 72  -counter is stor
16ea0 65 64 20 61 74 20 6f 66 66 73 65 74 20 32 34 2e  ed at offset 24.
16eb0 20 53 65 65 20 61 6c 73 6f 0a 20 20 20 20 20 20   See also.      
16ec0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
16ed0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
16ee0 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
16ef0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 43            u32 iC
16f00 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65 74  hangeCount = ret
16f10 72 69 65 76 65 33 32 62 69 74 73 28 70 50 61 67  rieve32bits(pPag
16f20 65 31 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  e1, 24);.       
16f30 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
16f40 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  +;.          sql
16f50 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
16f60 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
16f70 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
16f80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16f90 69 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d 70 50  iChangeCount!=pP
16fa0 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75  ager->iChangeCou
16fb0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
16fc0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
16fd0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
16fe0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61   }.          pPa
16ff0 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e  ger->iChangeCoun
17000 74 20 3d 20 69 43 68 61 6e 67 65 43 6f 75 6e 74  t = iChangeCount
17010 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
17030 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
17040 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
17050 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41  Pager->state<=PA
17060 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
17070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17080 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
17090 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
170a0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
170b0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
170c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
170d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
170e0 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
170f0 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
17100 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
17110 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
17120 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
17130 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
17140 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
17150 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
17160 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
17170 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  leased..**.** A 
17180 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61  _get works for a
17190 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
171a0 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
171b0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
171c0 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
171d0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
171e0 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
171f0 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
17200 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
17210 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
17220 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
17230 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
17240 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
17250 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
17260 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
17270 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
17280 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
17290 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
172a0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
172b0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
172c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
172d0 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
172e0 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
172f0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
17300 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
17310 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
17320 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
17330 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
17340 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
17350 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
17360 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
17370 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
17380 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28  ine and _lookup(
17390 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
173a0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
173b0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
173c0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
173d0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
173e0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
173f0 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
17400 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
17410 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
17420 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a  eas _lookup().**
17430 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
17440 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
17450 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
17460 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
17470 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
17480 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
17490 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
174a0 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
174b0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
174c0 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75  .** Since _looku
174d0 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
174e0 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
174f0 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
17500 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
17510 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
17520 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67 20 69 73  ** If clrFlag is
17530 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65   false, the page
17540 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63   contents are ac
17550 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
17560 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c 66   disk..** If clf
17570 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 69 74  Flag is true, it
17580 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
17590 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 65  is about to be e
175a0 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72 65 77  rased and.** rew
175b0 72 69 74 74 65 6e 20 77 69 74 68 6f 75 74 20 66  ritten without f
175c0 69 72 73 74 20 62 65 69 6e 67 20 72 65 61 64 20  irst being read 
175d0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  so there is no p
175e0 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a 2a 2a  oint it doing.**
175f0 20 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a   the disk I/O..*
17600 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17610 65 72 41 63 71 75 69 72 65 28 50 61 67 65 72 20  erAcquire(Pager 
17620 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
17630 6e 6f 2c 20 44 62 50 61 67 65 20 2a 2a 70 70 50  no, DbPage **ppP
17640 61 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c 61 67  age, int clrFlag
17650 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
17660 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
17670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
17680 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
17690 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65  K || pPager->nRe
176a0 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29  f>0 || pgno==1 )
176b0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
176c0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
176d0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
176e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
176f0 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
17700 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
17710 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
17720 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
17730 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
17740 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
17750 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
17760 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
17770 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
17780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17790 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
177a0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
177b0 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
177c0 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
177d0 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
177e0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
177f0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
17800 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17810 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
17820 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
17830 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
17840 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
17850 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ode;.  }..  /* I
17860 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
17870 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
17880 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
17890 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
178a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
178b0 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64  ile. pagerShared
178c0 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Lock() is a no-o
178d0 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74  p if .  ** a dat
178e0 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c  abase lock is al
178f0 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f  ready held..  */
17900 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61  .  rc = pagerSha
17910 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
17920 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
17940 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
17950 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
17960 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
17970 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67   );..  pPg = pag
17980 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
17990 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
179a0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
179b0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
179c0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
179d0 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
179e0 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
179f0 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53    int h;.    TES
17a00 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
17a10 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70  Miss);.    if( p
17a20 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61  Pager->nPage<pPa
17a30 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70  ger->mxPage || p
17a40 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30  Pager->pFirst==0
17a50 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20 20 20   || MEMDB ||.   
17a60 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 70 46       (pPager->pF
17a70 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26  irstSynced==0 &&
17a80 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
17a90 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  nc).    ){.     
17aa0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
17ab0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
17ac0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
17ad0 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20  >=pPager->nHash 
17ae0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
17af0 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
17b00 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20  le(pPager,.     
17b10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48        pPager->nH
17b20 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20  ash<256 ? 256 : 
17b30 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29  pPager->nHash*2)
17b40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
17b50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29  ager->nHash==0 )
17b60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
17b70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
17b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17b90 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73   }.      pPg = s
17ba0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
17bb0 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
17bc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a  Pager->pageSize.
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
17bf0 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50  sizeof(u32) + pP
17c00 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20  ager->nExtra.   
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d             + MEM
17c30 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74  DB*sizeof(PgHist
17c40 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ory) );.      if
17c50 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
17c60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17c70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
17c80 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
17c90 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
17ca0 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  g));.      if( M
17cb0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
17cc0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
17cd0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
17ce0 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48  ), 0, sizeof(PgH
17cf0 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20  istory));.      
17d00 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
17d10 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
17d20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
17d30 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
17d40 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
17d50 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
17d60 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
17d70 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  +;.      if( pPa
17d80 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65  ger->nPage>pPage
17d90 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20  r->nMaxPage ){. 
17da0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17db0 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d  Pager->nMaxPage=
17dc0 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d  =(pPager->nPage-
17dd0 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  1) );.        pP
17de0 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b  ager->nMaxPage++
17df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
17e00 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
17e10 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
17e20 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a  ager, 1, &pPg);.
17e30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17e40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17e50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17e60 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
17e70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
17e80 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
17e90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
17ea0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
17eb0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
17ec0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17ed0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  >aInJournal && (
17ee0 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
17ef0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
17f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65        sqlite3Che
17f10 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  ckMemory(pPager-
17f20 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >aInJournal, pgn
17f30 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65  o/8);.      asse
17f40 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
17f50 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
17f60 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
17f70 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  = (pPager->aInJo
17f80 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
17f90 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
17fa0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
17fb0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
17fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
17fd0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
17fe0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
17ff0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
18000 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18010 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29  aInStmt && (int)
18020 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
18030 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  mtSize.         
18040 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e      && (pPager->
18050 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20  aInStmt[pgno/8] 
18060 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
18070 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  !=0 ){.      pag
18080 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
18090 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  st(pPg);.    }el
180a0 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72  se{.      page_r
180b0 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
180c0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
180d0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
180e0 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  Pg);.    pPg->nR
180f0 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49  ef = 1;.    REFI
18100 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70  NFO(pPg);..    p
18110 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
18120 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
18130 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
18140 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
18150 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
18160 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
18170 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
18180 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65     nMax = sqlite
18190 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
181a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
181b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
181c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
181d0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
181e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  ;.      rc = pPa
181f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
18200 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18210 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
18220 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
18230 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
18240 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
18250 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
18260 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
18270 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
18280 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
18290 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
182a0 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20   nMax<(int)pgno 
182b0 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 63 6c 72  || MEMDB || (clr
182c0 46 6c 61 67 20 26 26 20 21 70 50 61 67 65 72 2d  Flag && !pPager-
182d0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  >alwaysRollback)
182e0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
182f0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
18300 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
18310 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
18320 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
18330 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
18340 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18350 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
18360 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69  >fd, (pgno-1)*(i
18370 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
18380 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
18390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
183a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
183b0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
183c0 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
183d0 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20  _DATA(pPg),.    
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183f0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
18400 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
18410 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
18420 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
18430 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
18440 29 29 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  )).      PAGERTR
18450 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70  ACE3("FETCH %d p
18460 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
18470 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
18480 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
18490 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48  DEC1(pPager, PGH
184a0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
184b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
184c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
184d0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
184e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
184f0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
18500 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
18510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18520 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
18530 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18540 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rc;.      }else{
18550 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e  .        TEST_IN
18560 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
18570 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18580 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
18590 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
185a0 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
185b0 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
185c0 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
185d0 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
185e0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
185f0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
18600 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
18610 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
18620 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
18630 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
18640 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
18650 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
18660 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
18670 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
18680 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
18690 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
186a0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
186b0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
186c0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
186d0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
186e0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
186f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
18700 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
18710 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
18720 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
18730 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
18740 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
18750 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28  ;.    TEST_INCR(
18760 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
18770 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
18780 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
18790 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
187a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
187b0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
187c0 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
187d0 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
187e0 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
187f0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
18800 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
18810 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
18820 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
18830 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
18840 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
18850 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
18860 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
18870 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
18880 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
18890 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
188a0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
188b0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
188c0 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
188d0 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
188e0 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
188f0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
18900 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
18910 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
18920 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
18930 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
18940 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
18950 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
18960 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
18970 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
18980 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
18990 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
189a0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
189b0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
189c0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
189d0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
189e0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
189f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
18a00 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
18a10 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
18a20 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  ( !pPager->pAll 
18a30 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  || pPager->exclu
18a40 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20  siveMode );.    
18a50 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
18a60 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18a70 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
18a80 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
18a90 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
18aa0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  n 0;.  }.  pPg =
18ab0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
18ac0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
18ad0 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75  f( pPg==0 ) retu
18ae0 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66  rn 0;.  page_ref
18af0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
18b00 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
18b10 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
18b20 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
18b30 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
18b40 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
18b50 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
18b60 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
18b70 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
18b80 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
18b90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
18ba0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
18bb0 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
18bc0 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
18bd0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
18be0 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
18bf0 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
18c00 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
18c10 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20  bPage *pPg){..  
18c20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
18c30 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
18c40 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
18c50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
18c60 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
18c70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
18c80 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43  FINFO(pPg);..  C
18c90 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
18ca0 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
18cb0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
18cc0 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
18cd0 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
18ce0 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
18cf0 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
18d00 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
18d10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
18d20 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
18d30 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
18d40 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
18d50 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
18d60 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
18d70 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
18d80 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
18d90 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
18da0 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
18db0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
18dc0 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
18dd0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
18de0 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
18df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18e00 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
18e10 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
18e20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
18e30 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
18e40 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
18e50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18e60 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
18e70 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
18e80 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
18e90 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
18ea0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
18eb0 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
18ec0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
18ed0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
18ee0 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
18ef0 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
18f00 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
18f10 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
18f20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18f30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
18f40 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
18f50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18f60 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
18f70 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
18f80 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d  ==0 && (!pPager-
18f90 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
18fa0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
18fb0 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20  lOff>0) ){.     
18fc0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
18fd0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
18fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18ff0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19000 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
19010 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
19020 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
19030 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
19040 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
19050 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
19060 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19070 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
19080 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
19090 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
190a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
190b0 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
190c0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
190d0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
190e0 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
190f0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
19100 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
19110 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
19120 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
19130 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
19140 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
19150 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
19160 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
19170 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
19180 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19190 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
191a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
191b0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
191c0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
191d0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
191e0 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
191f0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
19200 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
19210 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
19220 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
19230 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
19240 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
19250 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
19260 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
19270 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
19280 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
19290 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
192a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
192b0 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70  sOpenExclusive(p
192c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
192d0 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20   &pPager->jfd,. 
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19310 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
19320 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
19330 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
19340 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
19350 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
19360 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19370 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
19380 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
19390 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
193a0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
193b0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
193c0 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  }.    goto faile
193d0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
193e0 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
193f0 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
19400 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
19410 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a  r->full_fsync);.
19420 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
19430 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  llSync(pPager->f
19440 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
19450 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  fsync);.  sqlite
19460 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  3OsOpenDirectory
19470 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
19480 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
19490 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
194a0 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
194b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
194c0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50  tarted = 0;.  pP
194d0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
194e0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c   0;.  pPager->al
194f0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
19500 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
19510 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
19520 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
19530 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
19540 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74  errCode;.    got
19550 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
19560 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
19570 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
19580 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
19590 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  ize;..  rc = wri
195a0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
195b0 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  ger);..  if( pPa
195c0 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
195d0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
195e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
195f0 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42  qlite3PagerStmtB
19600 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
19610 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19620 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
19630 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
19640 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
19650 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
19660 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19680 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
19690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
196a0 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
196b0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
196c0 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
196d0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
196e0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  l);.  pPager->aI
196f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 23 69  nJournal = 0;.#i
19700 66 20 30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f 0.  if( rc==SQ
19710 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
19720 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
19730 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
19740 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  ure, then we wil
19750 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67  l not be closing
19760 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
19770 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74  * file. So delet
19780 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  e any journal fi
19790 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65 20 6a  le we may have j
197a0 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f 74 68  ust created. Oth
197b0 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74  erwise,.    ** t
197c0 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c 20 67  he system will g
197d0 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77 65 20  et confused, we 
197e0 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  have a read-lock
197f0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
19800 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65 72   a.    ** myster
19810 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73  ious journal has
19820 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65   appeared in the
19830 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20   filesystem..   
19840 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   */.    /* sqlit
19850 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
19860 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 20 2a 2f  r->zJournal); */
19870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19880 20 49 66 20 77 65 20 72 65 73 65 74 20 74 68 65   If we reset the
19890 20 70 61 67 65 72 20 68 65 72 65 2c 20 77 65 20   pager here, we 
198a0 77 69 6c 6c 20 64 65 6c 65 74 65 20 70 61 67 65  will delete page
198b0 73 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  s out from under
198c0 0a 20 20 20 20 2a 2a 20 76 61 72 69 6f 75 73 20  .    ** various 
198d0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 69 6c 6c  cursors and will
198e0 20 75 6c 74 69 6d 61 74 65 6c 79 20 73 65 67 66   ultimately segf
198f0 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20  ault. */.    /* 
19900 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
19910 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64  er); */.  }.#end
19920 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
19930 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
19940 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
19950 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19960 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
19970 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
19980 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
19990 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
199a0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
199b0 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 69 73 20  agerCommit() is 
199c0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
199d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
199e0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
199f0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
19a00 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
19a10 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
19a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19a30 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
19a40 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
19a50 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
19a60 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
19a70 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
19a80 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
19a90 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
19aa0 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
19ab0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
19ac0 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
19ad0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
19ae0 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
19af0 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
19b00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
19b10 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
19b20 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
19b30 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
19b40 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
19b50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19b60 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
19b70 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
19b80 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
19b90 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
19ba0 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
19bb0 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
19bc0 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
19bd0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
19be0 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
19bf0 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
19c00 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
19c10 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
19c20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
19c30 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
19c40 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
19c50 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
19c60 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
19c70 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
19c80 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
19c90 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
19ca0 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
19cb0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
19cc0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
19cd0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
19ce0 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
19cf0 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
19d00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
19d10 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
19d20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
19d30 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
19d40 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
19d50 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
19d60 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
19d70 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
19d80 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
19d90 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
19da0 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
19db0 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
19dc0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
19dd0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
19de0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
19df0 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
19e00 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
19e10 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
19e20 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
19e30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19e40 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
19e50 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
19e60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
19e70 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
19e80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19e90 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
19ea0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
19eb0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19ec0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
19ed0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
19ee0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
19ef0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
19f00 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
19f10 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
19f20 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
19f30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19f40 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
19f50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
19f60 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
19f70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19f90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
19fa0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
19fb0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
19fc0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
19fd0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
19fe0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
19ff0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1a000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a010 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
1a020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a030 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1a050 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1a060 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
1a070 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
1a080 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
1a090 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1a0a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1a0b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1a0c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a0e0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1a0f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1a100 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1a110 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1a120 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1a130 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1a140 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1a150 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1a160 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1a170 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1a180 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
1a190 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
1a1a0 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
1a1b0 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
1a1c0 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
1a1d0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1a1e0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
1a1f0 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
1a200 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a210 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
1a220 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
1a230 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1a240 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
1a250 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1a260 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1a270 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1a280 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1a290 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
1a2a0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1a2b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72  ;.    pPager->or
1a2c0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1a2d0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70  r->dbSize;.    p
1a2e0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1a2f0 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
1a300 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1a310 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66  /8 + 1 );.    if
1a320 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ( !pPager->aInJo
1a330 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1a340 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a350 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a360 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
1a370 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1a380 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1a390 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f  ert( !pPager->jo
1a3a0 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61  urnalOpen || pPa
1a3b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
1a3c0 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
1a3d0 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  OK );.  return r
1a3e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
1a3f0 20 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20   a page dirty.  
1a400 53 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c  Set its dirty fl
1a410 61 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f  ag and add it to
1a420 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61   the dirty.** pa
1a430 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
1a440 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74  ic void makeDirt
1a450 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  y(PgHdr *pPg){. 
1a460 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d   if( pPg->dirty=
1a470 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
1a480 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1a490 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1a4a0 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70  dirty = 1;.    p
1a4b0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61  Pg->pDirty = pPa
1a4c0 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ger->pDirty;.   
1a4d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69   if( pPager->pDi
1a4e0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61  rty ){.      pPa
1a4f0 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  ger->pDirty->pPr
1a500 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  evDirty = pPg;. 
1a510 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
1a520 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  revDirty = 0;.  
1a530 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1a540 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = pPg;.  }.}../
1a550 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1a560 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69   clean.  Clear i
1a570 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e 64  ts dirty bit and
1a580 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
1a590 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
1a5a0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1a5b0 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
1a5c0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1a5d0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
1a5e0 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  {.    pPg->dirty
1a5f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1a600 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  g->pDirty ){.   
1a610 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e     pPg->pDirty->
1a620 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
1a630 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a 20 20  ->pPrevDirty;.  
1a640 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
1a650 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b 0a 20  >pPrevDirty ){. 
1a660 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
1a670 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
1a680 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
1a690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
1a6a0 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ->pPager->pDirty
1a6b0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
1a6c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
1a6d0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
1a6e0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
1a6f0 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
1a700 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a710 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
1a720 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1a730 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
1a740 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
1a750 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
1a760 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
1a770 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
1a780 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
1a790 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1a7a0 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
1a7b0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
1a7c0 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
1a7d0 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
1a7e0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
1a7f0 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
1a800 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
1a810 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
1a820 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
1a830 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1a840 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
1a850 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
1a860 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
1a870 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
1a880 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
1a890 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
1a8a0 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
1a8b0 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
1a8c0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1a8d0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
1a8e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a8f0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
1a900 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
1a910 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
1a920 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
1a930 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1a940 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
1a950 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
1a960 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
1a970 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
1a980 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
1a990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1a9a0 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
1a9b0 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
1a9c0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1a9d0 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67  () or sqlite3Pag
1a9e0 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  erRollback() to.
1a9f0 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61  ** reset..*/.sta
1aa00 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
1aa10 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
1aa20 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
1aa30 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1aa40 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg);.  Pager *pP
1aa50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1aa60 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1aa70 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1aa80 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
1aa90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1aaa0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
1aab0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1aac0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1aad0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
1aae0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
1aaf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
1ab00 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1ab10 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1ab20 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
1ab30 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
1ab40 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
1ab50 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
1ab60 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
1ab70 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
1ab80 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
1ab90 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
1aba0 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
1abb0 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72  ..  */.  makeDir
1abc0 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  ty(pPg);.  if( p
1abd0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1abe0 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c   (pPg->inStmt ||
1abf0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1ac00 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
1ac10 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1ac20 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
1ac30 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
1ac40 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
1ac50 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1ac60 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
1ac70 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
1ac80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ac90 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
1aca0 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
1acb0 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
1acc0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1acd0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
1ace0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
1acf0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1ad00 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
1ad10 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
1ad20 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
1ad30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1ad40 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1ad50 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1ad60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ad70 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29  gerBegin(pPg, 0)
1ad80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ad90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ada0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1adb0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1adc0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1add0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1ade0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1adf0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1ae00 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1ae10 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1ae20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1ae30 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1ae40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ae50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1ae60 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1ae70 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1ae80 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
1ae90 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
1aea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
1aeb0 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a  tyCache = 1;.  .
1aec0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
1aed0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
1aee0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
1aef0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
1af00 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
1af10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1af20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1af30 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
1af40 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1af50 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
1af60 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1af70 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
1af80 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
1af90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1afa0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1afb0 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  (pPager->useJour
1afc0 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b  nal || MEMDB) ){
1afd0 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29  .      if( (int)
1afe0 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1aff0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1b000 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
1b010 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  zPg;.        if(
1b020 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1b030 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1b040 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1b050 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1b060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  );.          PAG
1b070 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41  ERTRACE3("JOURNA
1b080 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1b090 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b0a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1b0b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b0c0 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
1b0d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
1b0e0 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
1b0f0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
1b100 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
1b110 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1b120 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
1b130 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1b140 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
1b150 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1b160 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1b170 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1b180 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1b190 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
1b1a0 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20  cksum, saved;.  
1b1b0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
1b1c0 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  ata2, *pEnd;.   
1b1d0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
1b1e0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
1b1f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1b200 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
1b210 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1b220 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
1b230 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
1b240 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1b250 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
1b260 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
1b270 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
1b280 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1b290 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
1b2a0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
1b2b0 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
1b2c0 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1b2d0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1b2e0 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
1b2f0 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
1b300 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
1b310 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
1b320 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44         pEnd = pD
1b330 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70  ata2 + pPager->p
1b340 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
1b350 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a     pData2 -= 4;.
1b360 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20            saved 
1b370 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20  = *(u32*)pEnd;. 
1b380 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69           put32bi
1b390 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b  ts(pEnd, cksum);
1b3a0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20  .          szPg 
1b3b0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1b3c0 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+8;.          
1b3d0 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1b3e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1b3f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b400 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1b410 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
1b420 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20   szPg);.        
1b430 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
1b440 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
1b450 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1b460 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
1b470 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b480 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50  >journalOff, szP
1b490 67 29 29 0a 20 20 20 20 20 20 20 20 20 20 70 50  g)).          pP
1b4a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b4b0 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20   += szPg;.      
1b4c0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1b4d0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
1b4e0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
1b4f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1b500 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1b510 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1b520 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
1b530 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33  ;.          *(u3
1b540 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b  2*)pEnd = saved;
1b550 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72  ...  /* An error
1b560 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69   has occured wri
1b570 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
1b580 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
1b590 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e           ** tran
1b5a0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
1b5b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
1b5c0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
1b5d0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1b5e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b5f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b600 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b610 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  c;.          }..
1b620 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1b630 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
1b640 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b650 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
1b660 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
1b670 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b680 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
1b690 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1b6a0 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  7);.          pP
1b6b0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
1b6c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
1b6d0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
1b6e0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1b6f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  {.            pP
1b700 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1b710 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1b720 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1b730 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1b740 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1b750 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  t(pPg);.        
1b760 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1b770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b780 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1b790 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72   = !pPager->jour
1b7a0 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
1b7b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
1b7c0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1b7d0 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E4("APPEND %d pa
1b7e0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1b7f0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1b800 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1b810 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1b820 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
1b830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b840 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
1b850 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
1b860 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
1b870 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1b880 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1b890 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 1;.    }.  .  
1b8a0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
1b8b0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
1b8c0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
1b8d0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
1b8e0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
1b8f0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1b900 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
1b910 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
1b920 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
1b930 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1b940 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
1b950 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
1b960 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
1b970 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
1b980 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
1b990 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
1b9a0 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
1b9b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
1b9c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
1b9d0 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
1b9e0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1b9f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1ba00 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1ba10 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1ba20 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
1ba30 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1ba40 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  bSize );.      i
1ba50 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1ba60 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1ba70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1ba80 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1ba90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1baa0 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
1bab0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  =0 );.        pH
1bac0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
1bad0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
1bae0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1baf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
1bb00 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
1bb10 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1bb20 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
1bb30 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1bb40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1bb50 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1bb60 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1bb70 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1bb80 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1bb90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1bba0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1bbb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bbc0 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20   char *pData2 = 
1bbd0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1bbe0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1bbf0 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20 70   7)-4;.        p
1bc00 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
1bc10 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1bc20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1bc30 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1bc40 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >stfd, pData2, p
1bc50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
1bc60 34 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  4);.        PAGE
1bc70 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1bc80 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1bc90 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1bca0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1bcb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1bcc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1bcd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1bce0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1bcf0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1bd00 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  mtNRec++;.      
1bd10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bd20 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
1bd30 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1bd40 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
1bd50 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1bd60 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1bd70 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  }.      page_add
1bd80 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1bd90 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
1bda0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
1bdb0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
1bdc0 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
1bdd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1bde0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
1bdf0 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  RED );.  if( pPa
1be00 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
1be10 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  )pPg->pgno ){.  
1be20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1be30 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
1be40 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
1be50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1be60 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
1be70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
1be80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1be90 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  bSize++;.    }. 
1bea0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1beb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1bec0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1bed0 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61  o mark a data-pa
1bee0 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20  ge as writable. 
1bef0 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65  It uses .** page
1bf00 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65  r_write() to ope
1bf10 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
1bf20 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1bf30 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20  lready open).** 
1bf40 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61  and write the pa
1bf50 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65  ge *pData to the
1bf60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1bf70 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1bf80 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
1bf90 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
1bfa0 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
1bfb0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1bfc0 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
1bfd0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
1bfe0 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
1bff0 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
1c000 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
1c010 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
1c020 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
1c030 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
1c040 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
1c050 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
1c060 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
1c070 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
1c080 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1c090 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
1c0a0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
1c0b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
1c0c0 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
1c0d0 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
1c0e0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1c0f0 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
1c100 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
1c110 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
1c120 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c130 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  ;..  if( !MEMDB 
1c140 26 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  && nPagePerSecto
1c150 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
1c160 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
1c170 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
1c180 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1c190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1c1a0 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
1c1d0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
1c1e0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
1c1f0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b  /.    int nPage;
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1c220 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
1c230 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
1c240 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20  .    int ii;..  
1c250 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
1c260 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
1c270 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
1c280 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
1c290 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
1c2a0 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
1c2b0 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
1c2c0 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
1c2d0 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
1c2e0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1c2f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c300 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
1c310 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
1c320 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
1c330 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
1c340 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
1c350 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
1c360 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
1c370 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
1c380 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
1c390 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
1c3a0 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
1c3b0 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
1c3c0 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
1c3d0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
1c3e0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
1c3f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
1c400 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
1c410 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
1c420 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
1c430 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20     nPageCount = 
1c440 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1c450 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
1c460 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
1c470 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
1c480 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
1c490 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
1c4a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c4b0 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
1c4c0 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
1c4d0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
1c4e0 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
1c4f0 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
1c500 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
1c510 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
1c520 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
1c530 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
1c540 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
1c550 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
1c560 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
1c570 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
1c580 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
1c590 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1c5a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
1c5b0 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
1c5c0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
1c5d0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c  er->aInJournal |
1c5e0 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  | pg==pPg->pgno 
1c5f0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67  || .          pg
1c600 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
1c610 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d  ize || !(pPager-
1c620 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38  >aInJournal[pg/8
1c630 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20  ]&(1<<(pg&7))). 
1c640 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20       ) {.       
1c650 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
1c660 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1c670 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64  {.          PgHd
1c680 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
1c690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c6a0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1c6b0 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
1c6c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c6e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
1c6f0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1c700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1c710 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c720 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1c730 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1c740 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c750 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c760 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
1c770 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
1c780 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
1c790 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
1c7a0 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
1c7b0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1c7c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1c7d0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1c7e0 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
1c7f0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
1c800 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
1c810 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
1c820 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
1c830 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
1c840 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
1c850 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
1c860 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
1c870 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
1c880 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
1c890 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
1c8a0 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
1c8b0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
1c8c0 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23   pPg->dirty;.}.#
1c8d0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1c8e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
1c8f0 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  M./*.** Replace 
1c900 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
1c910 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
1c920 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
1c930 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
1c940 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
1c950 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
1c960 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
1c970 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1c980 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
1c990 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1c9a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
1c9b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1c9c0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
1c9d0 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pPg);.  if( rc==
1c9e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c9f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ca00 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
1ca10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ca20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
1ca30 63 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72  cpy(sqlite3Pager
1ca40 47 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44  GetData(pPg), pD
1ca50 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
1ca60 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
1ca70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1ca80 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
1ca90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1caa0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
1cab0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
1cac0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
1cad0 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
1cae0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
1caf0 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
1cb00 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22  mation on page "
1cb10 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68  pgno" back to th
1cb20 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
1cb30 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
1cb40 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
1cb50 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
1cb60 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
1cb70 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
1cb80 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
1cb90 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
1cba0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
1cbb0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
1cbc0 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
1cbd0 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
1cbe0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
1cbf0 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
1cc00 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
1cc10 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
1cc20 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
1cc30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
1cc40 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
1cc50 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
1cc60 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  ontRollback() be
1cc70 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
1cc80 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
1cc90 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
1cca0 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
1ccb0 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
1ccc0 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
1ccd0 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
1cce0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1ccf0 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
1cd00 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
1cd10 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
1cd20 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
1cd30 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
1cd40 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1cd50 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
1cd60 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
1cd70 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
1cd80 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
1cd90 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
1cda0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
1cdb0 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
1cdc0 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
1cdd0 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1cde0 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
1cdf0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
1ce00 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
1ce10 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
1ce20 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
1ce30 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
1ce40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
1ce50 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
1ce60 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
1ce70 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
1ce80 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
1ce90 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
1cea0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1ceb0 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
1cec0 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72  d,.** the dont_r
1ced0 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1cee0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1cef0 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  t because the pa
1cf00 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63  ge contains.** c
1cf10 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1cf20 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1cf30 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20 72  e sure it gets r
1cf40 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
1cf50 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f  ite.** of the do
1cf60 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61  nt_rollback() ca
1cf70 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ll..*/.void sqli
1cf80 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1cf90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1cfa0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
1cfb0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
1cfc0 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  ( MEMDB ) return
1cfd0 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
1cfe0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1cff0 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
1d000 20 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57   pPg!=0 );  /* W
1d010 65 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f  e never call _do
1d020 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20  nt_write unless 
1d030 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d  the page is in m
1d040 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77  em */.  pPg->alw
1d050 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
1d060 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1d070 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74  y && !pPager->st
1d080 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
1d090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1d0a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1d0b0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ED );.    if( pP
1d0c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
1d0d0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
1d0e0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d0f0 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1d100 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1d110 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1d120 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1d130 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1d140 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1d150 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1d160 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1d170 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1d180 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1d190 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1d1a0 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1d1b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1d1c0 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1d1d0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1d1e0 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1d1f0 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1d200 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1d210 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1d220 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1d230 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1d240 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1d250 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1d260 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1d270 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1d280 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1d290 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1d2a0 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1d2b0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1d2c0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1d2d0 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1d2e0 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1d2f0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1d300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d310 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1d320 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1d330 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20  of %d\n", pgno, 
1d340 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1d350 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1d360 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
1d370 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1d380 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
1d390 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51  (pPg);.#ifdef SQ
1d3a0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1d3b0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1d3c0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1d3d0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1d3e0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
1d3f0 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
1d400 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
1d410 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
1d420 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
1d430 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
1d440 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1d450 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
1d460 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
1d470 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
1d480 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1d490 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
1d4a0 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
1d4b0 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
1d4c0 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
1d4d0 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
1d4e0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d4f0 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
1d500 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1d510 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1d520 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ger;..  assert( 
1d530 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1d540 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1d550 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
1d560 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
1d570 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
1d580 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1d590 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
1d5a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d  aysRollback || M
1d5b0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
1d5c0 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
1d5d0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
1d5e0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1d5f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1d600 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d610 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
1d620 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1d630 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
1d640 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1d650 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1d660 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1d670 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
1d680 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1d690 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1d6a0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1d6b0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1d6c0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1d6d0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1d6e0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
1d6f0 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41 43   }.    PAGERTRAC
1d700 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
1d710 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
1d720 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
1d730 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1d740 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47  .    IOTRACE(("G
1d750 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
1d760 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1d770 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70  no)).  }.  if( p
1d780 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1d790 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
1d7a0 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1d7b0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
1d7c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
1d7d0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1d7e0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1d7f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1d800 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
1d810 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1d820 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1d830 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1d840 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1d850 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1d860 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
1d870 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1d880 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1d890 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
1d8a0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1d8b0 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
1d8c0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
1d8d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
1d8e0 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
1d8f0 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
1d900 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
1d910 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
1d920 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1d930 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
1d940 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
1d950 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1d960 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1d970 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1d980 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
1d990 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
1d9a0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1d9b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d9c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1d9d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1d9e0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1d9f0 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
1da00 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
1da10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1da20 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  R;.  }.  PAGERTR
1da30 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
1da40 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1da50 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1da60 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
1da70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
1da80 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
1da90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
1daa0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48   ){.      clearH
1dab0 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
1dac0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1dad0 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ));.      pPg->d
1dae0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
1daf0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1db00 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
1db10 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
1db20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1db30 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
1db40 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
1db50 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1db60 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1db70 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
1db80 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1db90 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44   = 0;.#ifndef ND
1dba0 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67  EBUG.    for(pPg
1dbb0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1dbc0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1dbd0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
1dbe0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1dbf0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1dc00 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1dc10 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
1dc20 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1dc30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1dc40 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
1dc50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dc60 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
1dc70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1dc80 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1dc90 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1dca0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1dcb0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1dcc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1dcd0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1dce0 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a  irtyCache==0 ){.
1dcf0 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c      /* Exit earl
1dd00 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  y (without doing
1dd10 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d   the time-consum
1dd20 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  ing sqlite3OsSyn
1dd30 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a  c() calls).    *
1dd40 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20  * if there have 
1dd50 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
1dd60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1dd70 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
1dd80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1dd90 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
1dda0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1ddb0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1ddc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1ddd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1dde0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
1ddf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1de00 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c  rSync(pPager, 0,
1de10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
1de20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1de30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
1de40 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
1de50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1de60 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
1de70 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1de80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1de90 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
1dea0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
1deb0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
1dec0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
1ded0 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
1dee0 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
1def0 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
1df00 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
1df10 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
1df20 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
1df30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1df40 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
1df50 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
1df60 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
1df70 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
1df80 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
1df90 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f  rotocol (SQLITE_
1dfa0 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c  PROTOCOL) or unl
1dfb0 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
1dfc0 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
1dfd0 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
1dfe0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1dff0 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
1e000 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
1e010 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
1e020 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
1e030 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
1e040 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
1e050 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
1e060 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
1e070 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
1e080 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
1e090 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
1e0a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e0b0 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
1e0c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1e0d0 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43   rc;.  PAGERTRAC
1e0e0 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
1e0f0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1e100 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1e110 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
1e120 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
1e130 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
1e140 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
1e150 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1e160 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
1e170 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
1e180 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1e190 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
1e1a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e1b0 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1e1c0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1e1d0 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
1e1e0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1e1f0 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1e200 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1e210 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
1e220 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
1e230 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1e240 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
1e250 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1e260 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1e270 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
1e280 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1e290 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
1e2a0 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
1e2b0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
1e2c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ize);.        PA
1e2d0 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42  GERTRACE3("ROLLB
1e2e0 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25  ACK-PAGE %d of %
1e2f0 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
1e300 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1e310 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e320 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1e330 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c  3("PAGE %d is cl
1e340 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d  ean on %d\n", p-
1e350 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1e360 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
1e370 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1e380 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
1e390 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a    p->dirty = 0;.
1e3a0 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e        p->inJourn
1e3b0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  al = 0;.      p-
1e3c0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
1e3d0 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20     p->pPrevStmt 
1e3e0 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  = p->pNextStmt =
1e3f0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
1e400 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
1e410 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1e420 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20  r->xReiniter(p, 
1e430 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1e460 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
1e470 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1e480 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1e490 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
1e4a0 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d  gDbSize;.    mem
1e4b0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
1e4c0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1e4d0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1e4e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1e4f0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1e500 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1e510 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
1e520 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
1e530 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
1e540 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1e550 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1e560 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1e570 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
1e580 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
1e590 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1e5a0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1e5b0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1e5c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
1e5d0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1e5e0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
1e5f0 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
1e600 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
1e610 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
1e620 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1e630 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1e640 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
1e650 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
1e660 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
1e670 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1e680 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
1e690 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72  rc2 = pager_unwr
1e6a0 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1e6b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e6c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e6d0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1e6e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1e6f0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1e700 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
1e710 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1e720 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66  e = -1;..  /* If
1e730 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e740 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
1e750 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f  CK, we can no lo
1e760 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70  nger trust the p
1e770 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e  ager.  ** cache.
1e780 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
1e790 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
1e7a0 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
1e7b0 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65  y error .  ** pe
1e7c0 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  rsistent..  */. 
1e7d0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1e7e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1e7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e800 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
1e810 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
1e820 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
1e830 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
1e840 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1e850 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
1e860 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
1e870 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
1e880 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
1e890 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1e8a0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1e8b0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
1e8c0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1e8d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1e8e0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  he pager..*/.int
1e8f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1e900 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
1e910 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1e920 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a  Pager->nRef;.}..
1e930 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1e940 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
1e950 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
1e960 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
1e970 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
1e980 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
1e990 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
1e9a0 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
1e9b0 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
1e9c0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
1e9d0 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
1e9e0 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
1e9f0 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
1ea00 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
1ea10 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
1ea20 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
1ea30 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
1ea40 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1ea50 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
1ea60 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
1ea70 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
1ea80 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f  [8] = pPager->nO
1ea90 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50  vfl;.  a[9] = pP
1eaa0 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
1eab0 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
1eac0 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
1ead0 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
1eae0 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
1eaf0 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
1eb00 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
1eb10 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
1eb20 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
1eb30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1eb40 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
1eb50 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
1eb60 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1eb70 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
1eb80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
1eb90 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
1eba0 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
1ebb0 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
1ebc0 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
1ebd0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
1ebe0 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42  qlite3PagerStmtB
1ebf0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
1ec00 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1ec10 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1ec20 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
1ec30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ec40 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1ec50 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
1ec60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1ec70 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
1ec80 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
1ec90 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1eca0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
1ecb0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
1ecc0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1ecd0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1ece0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
1ecf0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
1ed00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ed10 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
1ed20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1ed30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1ed40 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
1ed50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ed60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1ed70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1ed80 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
1ed90 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1eda0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1edb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1edc0 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
1edd0 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
1ede0 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  {.    /* sqlite3
1edf0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1ee00 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
1ee10 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1ee20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1ee30 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ee40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ee50 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1ee60 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
1ee70 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
1ee80 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1ee90 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1eea0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1eeb0 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
1eec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1eed0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
1eee0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
1eef0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ef00 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
1ef10 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
1ef20 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
1ef30 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
1ef40 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
1ef50 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
1ef60 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
1ef70 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
1ef80 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1ef90 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1efa0 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74  temp(&pPager->st
1efb0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
1efc0 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1efd0 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
1efe0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
1eff0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1f000 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
1f010 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
1f020 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
1f030 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f040 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
1f050 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
1f060 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
1f070 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1f080 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
1f090 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1f0a0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1f0b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f0c0 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
1f0d0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1f0e0 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
1f0f0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
1f100 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1f110 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1f120 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
1f130 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54  Next;.    PAGERT
1f140 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
1f150 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
1f160 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1f170 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1f180 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
1f190 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
1f1a0 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  0);.      /* sql
1f1b0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
1f1c0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
1f1d0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1f1e0 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
1f1f0 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
1f200 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
1f210 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
1f220 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
1f230 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
1f240 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
1f250 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
1f260 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mt;.      assert
1f270 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b  ( pPg->inStmt );
1f280 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1f290 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1f2a0 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
1f2b0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
1f2c0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  0;.      if( MEM
1f2d0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  DB ){.        Pg
1f2e0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1f2f0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1f300 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1f310 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1f320 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
1f330 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
1f340 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
1f350 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1f360 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
1f370 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1f380 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
1f390 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1f3a0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1f3b0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
1f3c0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
1f3d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f3e0 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
1f3f0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1f400 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
1f410 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
1f420 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1f430 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1f440 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
1f450 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
1f460 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
1f470 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f480 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
1f490 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
1f4a0 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  *pPg;.      for(
1f4b0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
1f4c0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  t; pPg; pPg=pPg-
1f4d0 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
1f4e0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1f4f0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1f500 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1f510 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1f520 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
1f530 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1f540 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1f550 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
1f560 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
1f570 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1f580 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
1f590 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
1f5a0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1f5b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1f5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1f5d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1f5e0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
1f5f0 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  .      memoryTru
1f600 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
1f610 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f620 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1f630 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1f640 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
1f650 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1f660 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
1f670 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
1f680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1f690 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f6a0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1f6b0 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20  tAutoopen = 0;. 
1f6c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f6d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1f6e0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
1f6f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f700 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1f710 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
1f720 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
1f730 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1f740 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f750 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
1f760 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
1f770 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
1f780 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
1f790 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
1f7a0 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
1f7b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1f7c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
1f7d0 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
1f7e0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
1f7f0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
1f800 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1f810 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1f820 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
1f830 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
1f840 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1f850 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
1f860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f870 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
1f880 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
1f890 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
1f8a0 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
1f8b0 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
1f8c0 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
1f8d0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
1f8e0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
1f8f0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
1f900 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1f910 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a  r->noSync;.}../*
1f920 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
1f930 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
1f940 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f950 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20  PagerSetCodec(. 
1f960 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
1f970 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
1f980 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
1f990 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
1f9a0 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
1f9b0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
1f9c0 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
1f9d0 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
1f9e0 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  CodecArg;.}../*.
1f9f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fa00 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
1fa10 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
1fa20 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
1fa30 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
1fa40 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
1fa50 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1fa60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1fa70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1fa80 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
1fa90 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
1faa0 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
1fab0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
1fac0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1fad0 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
1fae0 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ountDone ){.    
1faf0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1fb00 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1fb10 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
1fb20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fb30 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
1fb40 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
1fb50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fb60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fb70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fb80 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
1fb90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fba0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1fbb0 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 61  c;.  .    /* Rea
1fbc0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
1fbd0 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20  lue at byte 24. 
1fbe0 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  */.    change_co
1fbf0 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
1fc00 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
1fc10 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e  4);.  .    /* In
1fc20 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1fc30 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1fc40 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1fc50 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1fc60 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1fc70 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  +;.    put32bits
1fc80 28 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54  (((char*)PGHDR_T
1fc90 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b  O_DATA(pPgHdr))+
1fca0 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
1fcb0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1fcc0 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20  >iChangeCount = 
1fcd0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1fce0 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
1fcf0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
1fd00 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
1fd10 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1fd20 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
1fd30 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1fd40 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
1fd50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fd60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1fd70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fd80 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1fd90 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1fda0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1fdb0 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1fdc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1fdd0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1fde0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1fdf0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1fe00 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1fe10 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1fe20 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1fe30 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1fe40 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1fe50 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1fe60 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1fe70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fe80 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1fe90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1fea0 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1feb0 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1fec0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1fed0 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1fee0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1fef0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1ff00 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1ff10 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1ff20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1ff30 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1ff40 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1ff50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ff60 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1ff70 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1ff80 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1ff90 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1ffa0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1ffb0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1ffc0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1ffd0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
1ffe0 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
1fff0 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63  parameter nTrunc
20000 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
20010 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
20020 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
20030 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65  o.** nTrunc page
20040 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20  s (this is used 
20050 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
20060 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e  atabases)..*/.in
20070 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
20080 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
20090 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
200a0 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
200b0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
200c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41  SQLITE_OK;..  PA
200d0 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42  GERTRACE4("DATAB
200e0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
200f0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
20100 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
20110 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
20120 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
20130 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
20140 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
20150 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
20160 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
20170 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
20180 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
20190 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
201a0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
201b0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
201c0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
201d0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
201e0 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
201f0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
20200 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
20210 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
20220 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
20230 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
20240 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
20250 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
20260 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
20270 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
20280 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
20290 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
202a0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
202b0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
202c0 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
202d0 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
202e0 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
202f0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
20300 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
20310 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
20320 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
20330 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
20340 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
20350 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
20360 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
20370 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
20380 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
20390 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
203a0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
203b0 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
203c0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
203d0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
203e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
203f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20400 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
20410 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20420 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
20430 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
20440 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
20450 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
20460 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
20470 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
20480 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
20490 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
204a0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
204b0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
204c0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
204d0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
204e0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
204f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
20500 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69  gno i;.        i
20510 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
20520 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
20530 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
20540 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
20550 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
20560 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
20570 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
20580 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
20590 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
205a0 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
205b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
205c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
205d0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b  Pager, i, &pPg);
205e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
205f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20600 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
20610 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
20620 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
20630 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ite(pPg);.      
20640 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20650 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
20660 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20680 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
20690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
206a0 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e    } .      }.#en
206b0 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77  dif.      rc = w
206c0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
206d0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
206e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
206f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20700 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
20710 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
20720 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
20730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20740 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
20750 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23  c_exit;.    }..#
20760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20770 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20780 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
20790 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
207a0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
207b0 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
207c0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
207d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
207e0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
207f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
20800 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
20810 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
20820 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
20830 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
20840 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
20850 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
20860 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
20870 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
20880 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20890 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
208a0 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  ync_exit;..    /
208b0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
208c0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
208d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
208e0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
208f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
20900 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  (pPager->fd, 0);
20910 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
20920 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e  CE(("DBSYNC %p\n
20930 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
20940 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
20950 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
20960 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42   }else if( MEMDB
20970 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b   && nTrunc!=0 ){
20980 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20990 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
209a0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
209b0 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
209c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
209d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
209e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
209f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
20a00 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
20a10 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
20a20 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
20a30 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
20a40 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
20a50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
20a60 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
20a70 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
20a80 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
20a90 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
20aa0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20ab0 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
20ac0 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
20ad0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
20ae0 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
20af0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
20b00 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
20b10 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
20b20 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
20b30 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
20b40 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
20b50 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
20b60 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
20b70 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
20b80 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
20b90 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
20ba0 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
20bb0 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
20bc0 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
20bd0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
20be0 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
20bf0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
20c00 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
20c10 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
20c20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
20c30 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
20c40 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
20c50 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
20c60 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
20c70 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
20c80 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
20c90 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
20ca0 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
20cb0 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
20cc0 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
20cd0 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
20ce0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
20cf0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
20d00 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e  s active)..*/.in
20d10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
20d20 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
20d30 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
20d40 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
20d50 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
20d60 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
20d70 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
20d80 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
20d90 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
20da0 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56  PAGERTRACE5("MOV
20db0 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
20dc0 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
20dd0 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
20de0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
20df0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
20e00 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e  g->needSync, pgn
20e10 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  o);.  IOTRACE(("
20e20 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
20e30 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
20e40 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69  gno, pgno))..  i
20e50 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
20e60 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
20e70 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
20e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20e90 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  g->inJournal );.
20ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
20eb0 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
20ec0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
20ed0 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
20ee0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
20ef0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68  rom it's hash-ch
20f00 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
20f10 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
20f20 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
20f30 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
20f40 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
20f50 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
20f60 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
20f70 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
20f80 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
20f90 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
20fa0 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
20fb0 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
20fc0 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
20fd0 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
20fe0 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
20ff0 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
21000 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
21010 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64  e..  */.  pPgOld
21020 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
21030 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
21040 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
21050 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c     assert( pPgOl
21060 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20  d->nRef==0 );.  
21070 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
21080 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64  n(pPager, pPgOld
21090 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  );.    makeClean
210a0 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66  (pPgOld);.    if
210b0 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79  ( pPgOld->needSy
210c0 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
210d0 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f  rt( pPgOld->inJo
210e0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70  urnal );.      p
210f0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
21100 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  1;.      pPg->ne
21110 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
21120 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21130 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
21140 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
21150 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75  ange the page nu
21160 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64  mber for pPg and
21170 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
21180 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61  the new hash-cha
21190 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in. */.  assert(
211a0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50   pgno!=0 );.  pP
211b0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
211c0 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50    h = pgno & (pP
211d0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
211e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
211f0 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
21200 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
21210 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
21220 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
21230 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
21240 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
21250 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
21260 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
21270 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
21280 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
21290 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
212a0 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44  sh = 0;..  makeD
212b0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
212c0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
212d0 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
212e0 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
212f0 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
21300 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
21310 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
21320 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
21330 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
21340 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
21350 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
21360 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
21370 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
21380 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
21390 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
213a0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
213b0 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
213c0 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
213d0 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
213e0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
213f0 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
21400 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
21410 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
21420 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
21430 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
21440 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
21450 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
21460 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
21470 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
21480 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
21490 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
214a0 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
214b0 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
214c0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
214d0 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
214e0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
214f0 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
21500 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
21510 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
21520 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21530 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
21540 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
21550 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
21560 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21570 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21580 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
21590 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
215a0 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  dr->needSync = 1
215b0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e  ;.    pPgHdr->in
215c0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
215d0 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64   makeDirty(pPgHd
215e0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
215f0 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
21600 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
21610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
21620 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
21630 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21640 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
21650 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
21660 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
21670 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
21680 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
21690 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
216a0 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
216b0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
216c0 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
216d0 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
216e0 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
216f0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
21700 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
21710 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
21720 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
21730 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
21740 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
21750 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
21760 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
21770 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f  pPager?PGHDR_TO_
21780 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
21790 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r):0);.}../*.** 
217a0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
217b0 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
217c0 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
217d0 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
217e0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
217f0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
21800 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
21810 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
21820 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
21830 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
21840 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
21850 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
21860 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
21870 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
21880 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
21890 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
218a0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
218b0 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
218c0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
218d0 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
218e0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
218f0 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
21900 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
21910 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
21920 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
21930 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
21940 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
21950 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
21960 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69   int eMode){.  i
21970 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20  f( eMode>=0 ){. 
21980 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
21990 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65  siveMode = eMode
219a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
219b0 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
219c0 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69  usiveMode;.}..#i
219d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
219e0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
219f0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
21a00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21a10 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
21a20 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
21a30 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
21a40 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
21a50 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
21a60 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
21a70 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
21a80 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
21a90 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
21aa0 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
21ab0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
21ac0 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
21ad0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21ae0 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53  n sqlite3OsLockS
21af0 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29  tate(pPager->fd)
21b00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
21b10 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21b20 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
21b30 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
21b40 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
21b50 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
21b60 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
21b70 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50  e3PagerRefdump(P
21b80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21b90 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
21ba0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
21bb0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
21bc0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
21bd0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
21be0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
21bf0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
21c00 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
21c10 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
21c20 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
21c30 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
21c40 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
21c50 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
21c60 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
21c70 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
21c80 4f 20 2a 2f 0a                                   O */.