/ Hex Artifact Content
Login

Artifact 2cc40af071948f6e57eb042f3a99a8921931effc:


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: 32 20 32 30 30 37 2f 30 33 2f 32 37 20 31 36 3a  2 2007/03/27 16:
0360: 31 39 3a 35 32 20 64 61 6e 69 65 6c 6b 31 39 37  19:52 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 72 63 20 3d 20 73 71 6c  ;.      rc = sql
8550: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
8560: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
8570: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8580: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
8590: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
85a0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
85b0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
85c0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
85d0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
85e0: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
85f0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
8600: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
8610: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
8620: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
8630: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61   0;.      pPg->a
8640: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
8650: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
8660: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
8670: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
8680: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
8690: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
86a0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
86b0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
86c0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
86d0: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
86e0: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
86f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8700: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
8710: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
8720: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8730: 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
8740: 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  | pPager->useJou
8750: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
8760: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
8770: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
8780: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
8790: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
87a0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
87b0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
87c0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
87d0: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
87e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
87f0: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
8800: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8810: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
8820: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
8830: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8840: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
8850: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
8860: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8870: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8880: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
8890: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
88a0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
88b0: 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28   -1;..  return (
88c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
88d0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
88e0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
88f0: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
8900: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
8910: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
8920: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
8930: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8940: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8950: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8960: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8970: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8980: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
8990: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
89a0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
89b0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
89c0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
89d0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
89e0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
89f0: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
8a00: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
8a10: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8a20: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
8a30: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8a40: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8a50: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8a60: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8a70: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8a80: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
8a90: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
8aa0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
8ab0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
8ac0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
8ad0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
8ae0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
8af0: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
8b00: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
8b10: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
8b20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8b30: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8b40: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8b50: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8b60: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8b70: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8b80: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
8b90: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
8ba0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
8bb0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
8bc0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
8bd0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
8be0: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
8bf0: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
8c00: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
8c10: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
8c20: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
8c30: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
8c40: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
8c50: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
8c60: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
8c70: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
8c80: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
8c90: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
8ca0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
8cb0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
8cc0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
8cd0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
8ce0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
8cf0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
8d00: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
8d10: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
8d20: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
8d30: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
8d40: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
8d50: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
8d60: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
8d70: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
8d80: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
8d90: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
8da0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
8db0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
8dc0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
8dd0: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
8de0: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
8df0: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
8e00: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
8e10: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
8e20: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
8e30: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
8e40: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
8e50: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
8e60: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
8e70: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
8e80: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
8e90: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
8ea0: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
8eb0: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
8ec0: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
8ed0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8ee0: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
8ef0: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
8f00: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
8f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8f20: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
8f30: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
8f40: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
8f50: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
8f60: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
8f70: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
8f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8f90: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
8fa0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
8fb0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fd0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
8fe0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
8ff0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
9000: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
9010: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
9020: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
9030: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
9040: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
9050: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
9060: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
9070: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
9080: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
9090: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
90a0: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
90b0: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
90c0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
90d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
90e0: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
90f0: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
9100: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9110: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
9120: 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e  Cksum ? pPager->
9130: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
9140: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
9150: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
9160: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9170: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
9180: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9190: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
91a0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
91b0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
91c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
91d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
91e0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
91f0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9200: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
9210: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
9220: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
9230: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
9240: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
9250: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
9260: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
9270: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
9280: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
9290: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
92a0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
92b0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
92c0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
92d0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
92e0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
92f0: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
9300: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
9310: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
9320: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
9330: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
9340: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
9350: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
9360: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
9370: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
9380: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9390: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
93a0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
93b0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
93c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
93d0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
93e0: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
93f0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9400: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
9410: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9420: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
9430: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9440: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
9450: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
9460: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
9470: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9480: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
9490: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
94a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
94b0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
94c0: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
94d0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
94e0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
94f0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
9500: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
9510: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
9520: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
9530: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
9540: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
9550: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
9560: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9570: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
9580: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
9590: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
95a0: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
95b0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
95c0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45   **.  ** If in E
95d0: 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
95e0: 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
95f0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69  he pager cache i
9600: 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a  f it exists.  **
9610: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
9620: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
9630: 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20  then marked not 
9640: 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dirty..  **.  **
9650: 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20   Ticket #1171:  
9660: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  The statement jo
9670: 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
9680: 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ain page content
9690: 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69   that is.  ** di
96a0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
96b0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74   page content at
96c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
96d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
96e0: 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20   ** This occurs 
96f0: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63  when a page is c
9700: 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20  hanged prior to 
9710: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73  the start of a s
9720: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68  tatement.  ** th
9730: 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e  en changed again
9740: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
9750: 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c  ement.  When rol
9760: 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61  ling back such a
9770: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
9780: 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74  we must not writ
9790: 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  e to the origina
97a0: 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73  l database unles
97b0: 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66  s we know.  ** f
97c0: 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  or certain that 
97d0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
97e0: 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68  ntents are in th
97f0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
9800: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
9810: 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 66  therwise, if a f
9820: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63  ull ROLLBACK occ
9830: 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73 74  urs after the st
9840: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  atement.  ** rol
9850: 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52  lback the full R
9860: 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74  OLLBACK will not
9870: 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61 67   restore the pag
9880: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
9890: 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20  l.  ** content. 
98a0: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
98b0: 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f  must be met befo
98c0: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
98d0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
98e0: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
98f0: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
9900: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
9910: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
9920: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  iginal.  ** page
9930: 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74   content is in t
9940: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
9950: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
9960: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
9970: 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20  n.  ** cache or 
9980: 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65  else it is marke
9990: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
99a0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
99b0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
99c0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
99d0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
99e0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
99f0: 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b  IVE || pPg!=0 );
9a00: 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
9a10: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
9a20: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
9a30: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a  pPager), pgno);.
9a40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
9a50: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9a60: 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20  SIVE && (pPg==0 
9a70: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
9a80: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==0) ){.    rc =
9a90: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
9aa0: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
9ab0: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
9ac0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9ad0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9ae0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
9af0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
9b00: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
9b10: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
9b20: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
9b30: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
9b40: 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
9b50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
9b60: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
9b70: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
9b80: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
9b90: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
9ba0: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
9bb0: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
9bc0: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
9bd0: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
9be0: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
9bf0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
9c00: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
9c10: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
9c20: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
9c30: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
9c40: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
9c50: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
9c60: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
9c70: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
9c80: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
9c90: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
9ca0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
9cb0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f  id *pData;.    /
9cc0: 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e  * assert( pPg->n
9cd0: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
9ce0: 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  gno==1 ); */.   
9cf0: 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54   pData = PGHDR_T
9d00: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20  O_DATA(pPg);.   
9d10: 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61   memcpy(pData, a
9d20: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9d30: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
9d40: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
9d50: 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49  ctor ){  /*** FI
9d60: 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68  X ME:  Should th
9d70: 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a  is be xReinit? *
9d80: 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72  **/.      pPager
9d90: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50  ->xDestructor(pP
9da0: 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
9db0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ize);.    }.#ifd
9dc0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
9dd0: 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
9de0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
9df0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
9e00: 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45 43 31  endif.    CODEC1
9e10: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
9e20: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 0a  pPg->pgno, 3);..
9e30: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
9e40: 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  as page 1, then 
9e50: 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  restore the valu
9e60: 65 20 6f 66 20 50 61 67 65 72 2e 69 43 68 61 6e  e of Pager.iChan
9e70: 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  geCount */.    i
9e80: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
9e90: 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43 68 61      pPager->iCha
9ea0: 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65 74 72 69  ngeCount = retri
9eb0: 65 76 65 33 32 62 69 74 73 28 70 50 67 2c 20 32  eve32bits(pPg, 2
9ec0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  4);.    }.  }.  
9ed0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9ee0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
9ef0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
9f00: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
9f10: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
9f20: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
9f30: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
9f40: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
9f50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
9f60: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
9f70: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
9f80: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9f90: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
9fa0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
9fb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9fc0: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
9fd0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
9fe0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9ff0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
a000: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
a010: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
a020: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
a030: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
a040: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
a050: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
a060: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
a070: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
a080: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
a090: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
a0a0: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
a0b0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
a0c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
a0d0: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
a0e0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
a0f0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
a100: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
a110: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
a120: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
a130: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
a140: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
a150: 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b  ile *master = 0;
a160: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
a170: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
a180: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
a190: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a1a0: 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
a1b0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
a1c0: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
a1d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
a1e0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
a1f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a200: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
a210: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
a220: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
a230: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
a240: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
a250: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
a260: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
a270: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nce..  */.  rc =
a280: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
a290: 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20  adOnly(zMaster, 
a2a0: 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20  &master);.  if( 
a2b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a2c0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a2d0: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
a2e0: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
a2f0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
a300: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
a310: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
a320: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a330: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a340: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
a350: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
a360: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
a370: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
a380: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
a390: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
a3a0: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
a3b0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
a3c0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
a3d0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
a3e0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
a3f0: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
a400: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
a410: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
a420: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
a430: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
a440: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
a450: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
a460: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
a470: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
a480: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
a490: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
a4a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a4b0: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
a4c0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
a4d0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
a4e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
a4f0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a500: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
a510: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
a520: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
a530: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
a540: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
a550: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
a560: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
a570: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
a580: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
a590: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a5a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
a5b0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
a5c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
a5d0: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
a5e0: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
a5f0: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
a600: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
a610: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
a620: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
a630: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
a640: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
a650: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
a660: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
a670: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
a680: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
a690: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
a6a0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
a6b0: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
a6c0: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
a6d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a6e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
a6f0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a700: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a710: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
a720: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
a730: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
a740: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
a750: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
a760: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
a770: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a780: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
a790: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a7a0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
a7b0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
a7c0: 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63  erPtr!=0 && strc
a7d0: 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
a7e0: 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
a7f0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
a800: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
a810: 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
a820: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
a830: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
a840: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
a850: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a860: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
a870: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a880: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
a890: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
a8a0: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
a8b0: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
a8c0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d   }.  }.  .  rc =
a8d0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
a8e0: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
a8f0: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
a900: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
a910: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
a920: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
a930: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
a940: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
a950: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a960: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
a970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
a980: 69 66 20 30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  if 0./*.** Make 
a990: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
a9a0: 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69  e cache agree wi
a9b0: 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
a9c0: 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  sk.  In other wo
a9d0: 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74  rds,.** reread t
a9e0: 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74  he disk to reset
a9f0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
aa00: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
aa10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
aa20: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f  alled after a ro
aa30: 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20  llback in which 
aa40: 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74  some of the dirt
aa50: 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73  y cache.** pages
aa60: 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20   had never been 
aa70: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64  written out to d
aa80: 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  isk.  We need to
aa90: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
aaa0: 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20  * cache content 
aab0: 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20  and the easiest 
aac0: 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69  way to do that i
aad0: 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
aae0: 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62  old content.** b
aaf0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ack from the dis
ab00: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
ab10: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
ab20: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
ab30: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
ab40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ab50: 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50  ITE_OK;.  for(pP
ab60: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
ab70: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
ab80: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61  extAll){.    cha
ab90: 72 20 2a 7a 42 75 66 20 3d 20 70 50 61 67 65 72  r *zBuf = pPager
aba0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20  ->pTmpSpace;    
abb0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
abc0: 61 67 65 20 66 6f 72 20 6f 6e 65 20 70 61 67 65  age for one page
abd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
abe0: 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e  ->dirty ) contin
abf0: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74  ue;.    if( (int
ac00: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
ac10: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
ac20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
ac30: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
ac40: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
ac50: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28  >pageSize*(i64)(
ac60: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20  pPg->pgno-1));. 
ac70: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
ac80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ac90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
aca0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
acb0: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
acc0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
acd0: 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
ace0: 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20  CE3("REFETCH %d 
acf0: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
ad00: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
ad10: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
ad20: 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
ad30: 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67       CODEC1(pPag
ad40: 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70  er, zBuf, pPg->p
ad50: 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c  gno, 2);.    }el
ad60: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
ad70: 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72  (zBuf, 0, pPager
ad80: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
ad90: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
ada0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
adb0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
adc0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
add0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
ade0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47  .      memcpy(PG
adf0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
ae00: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
ae10: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
ae20: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
ae30: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
ae40: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
ae50: 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  ter(pPg, pPager-
ae60: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
ae70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae80: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
ae90: 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
aea0: 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
aeb0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
aec0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
aed0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
aee0: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
aef0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
af00: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
af10: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
af20: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
af30: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
af40: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
af50: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
af60: 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
af70: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
af80: 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65  main file of the
af90: 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20   given pager to 
afa0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
afb0: 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64  ges.** indicated
afc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
afd0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
afe0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
aff0: 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  t nPage){.  asse
b000: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
b010: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
b020: 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  VE );.  return s
b030: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
b040: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
b050: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
b060: 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  64)nPage);.}../*
b070: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
b080: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
b090: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
b0a0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
b0b0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
b0c0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
b0d0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
b0e0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
b0f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b100: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
b110: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
b120: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
b130: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
b140: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
b150: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
b160: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
b170: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
b180: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
b190: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
b1a0: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
b1b0: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
b1c0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
b1d0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
b1e0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
b1f0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
b200: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
b210: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
b220: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
b230: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
b240: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
b250: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
b260: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
b270: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
b280: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
b290: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b2a0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
b2b0: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
b2c0: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
b2d0: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
b2e0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
b2f0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
b300: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
b310: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
b320: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b330: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
b340: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
b350: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
b360: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
b370: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
b380: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
b390: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
b3a0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
b3b0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
b3c0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
b3d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
b3e0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
b3f0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
b400: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
b410: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
b420: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
b430: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
b440: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
b450: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
b460: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
b470: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
b480: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
b490: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
b4a0: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
b4b0: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
b4c0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
b4d0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
b4e0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
b4f0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
b500: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
b510: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
b520: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
b530: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
b540: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
b550: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
b560: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
b570: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
b580: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
b590: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
b5a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
b5b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
b5c0: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
b5d0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
b5e0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
b5f0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
b600: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
b610: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
b620: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
b630: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
b640: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
b650: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
b660: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
b670: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
b680: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b690: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
b6a0: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
b6b0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
b6c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
b6d0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
b6e0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
b6f0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
b700: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
b710: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
b720: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
b730: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
b740: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
b750: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
b760: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
b770: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
b780: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
b790: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
b7a0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
b7b0: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
b7c0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
b7d0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
b7e0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
b7f0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
b800: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
b810: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
b820: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
b830: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
b840: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
b850: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
b860: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
b870: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
b880: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
b890: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
b8a0: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
b8b0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
b8c0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
b8d0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
b8e0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
b8f0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
b900: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
b910: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
b920: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
b930: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
b940: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
b950: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
b960: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
b970: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
b980: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
b990: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
b9a0: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
b9b0: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
b9c0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
b9d0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
b9e0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
b9f0: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
ba00: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
ba10: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
ba20: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
ba30: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
ba40: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
ba50: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
ba60: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
ba70: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
ba80: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
ba90: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
baa0: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
bab0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
bac0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
bad0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
bae0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
baf0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
bb00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
bb10: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
bb20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bb30: 20 69 73 48 6f 74 29 7b 0a 20 20 69 36 34 20 73   isHot){.  i64 s
bb40: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
bb50: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bb60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bb70: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
bb80: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
bb90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bba0: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
bbb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
bbc0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
bbd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bbe0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
bbf0: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
bc00: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bc10: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
bc20: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
bc30: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
bc40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
bc50: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
bc60: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
bc70: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
bc80: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
bc90: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
bca0: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
bcb0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
bcc0: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
bcd0: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
bce0: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
bcf0: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
bd00: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
bd10: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
bd20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bd30: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
bd40: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
bd50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
bd60: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
bd70: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
bd80: 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
bd90: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
bda0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
bdb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
bdc0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
bdd0: 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
bde0: 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
bdf0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
be00: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
be10: 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
be20: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
be30: 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
be40: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
be50: 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
be60: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
be70: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
be80: 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
be90: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
bea0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
beb0: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
bec0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
bed0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
bee0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bef0: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
bf00: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
bf10: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
bf20: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
bf30: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
bf40: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
bf50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
bf60: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
bf70: 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
bf80: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
bf90: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
bfa0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
bfb0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
bfc0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a  alOff = 0;..  /*
bfd0: 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
bfe0: 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
bff0: 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
c000: 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
c010: 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
c020: 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
c030: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
c040: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
c050: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
c060: 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
c070: 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
c080: 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
c090: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
c0a0: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
c0b0: 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
c0c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
c0d0: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
c0e0: 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
c0f0: 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
c100: 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
c110: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
c120: 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
c130: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
c140: 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
c150: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
c160: 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
c170: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
c180: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
c190: 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
c1a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c1b0: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
c1c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c1d0: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
c1e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c1f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
c200: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
c210: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
c220: 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
c230: 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
c240: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
c250: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
c260: 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
c270: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
c280: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
c290: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
c2a0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
c2b0: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
c2c0: 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
c2d0: 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
c2e0: 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
c2f0: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
c300: 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
c310: 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
c320: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
c330: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
c340: 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
c350: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
c360: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
c370: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c380: 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
c390: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
c3a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
c3b0: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
c3c0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c3d0: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
c3e0: 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
c3f0: 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
c400: 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
c410: 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
c420: 70 72 6f 63 65 73 73 2e 20 49 6e 20 74 68 69 73  process. In this
c430: 20 63 61 73 65 20 74 68 65 20 72 65 73 74 20 6f   case the rest o
c440: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c450: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 20  le consists of. 
c460: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64     ** journalled
c470: 20 63 6f 70 69 65 73 20 6f 66 20 70 61 67 65 73   copies of pages
c480: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
c490: 20 72 65 61 64 20 62 61 63 6b 20 69 6e 74 6f 20   read back into 
c4a0: 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  the cache..    *
c4b0: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
c4c0: 30 20 26 26 20 21 69 73 48 6f 74 20 29 7b 0a 20  0 && !isHot ){. 
c4d0: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
c4e0: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
c4f0: 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
c500: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c510: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c520: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
c530: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
c540: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
c550: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
c560: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
c570: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
c580: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
c590: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
c5a0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
c5b0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
c5c0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
c5d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
c5e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c5f0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
c600: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
c610: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
c620: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
c630: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20  ==mxPg );.      
c640: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
c650: 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
c660: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
c670: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c680: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c690: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
c6a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
c6b0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
c6c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
c6d0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
c6e0: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
c6f0: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c700: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c710: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
c720: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
c730: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
c740: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c750: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c760: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
c770: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c780: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c790: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c7a0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
c7b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c7c0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
c7d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c7e0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
c7f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c800: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c810: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
c820: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
c830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c840: 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
c850: 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
c860: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
c870: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
c880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c890: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
c8a0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
c8b0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
c8c0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
c8d0: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
c8e0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
c8f0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
c900: 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
c910: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
c920: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
c930: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
c940: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
c950: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c960: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
c970: 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
c980: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
c990: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
c9a0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
c9b0: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
c9c0: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
c9d0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
c9e0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
c9f0: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
ca00: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
ca10: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
ca20: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
ca30: 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  t PAGER_SECTOR_S
ca40: 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  IZE.  ** value. 
ca50: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
ca60: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
ca70: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
ca80: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73    */.  pPager->s
ca90: 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
caa0: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
cab0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 72  pPager->fd);.  r
cac0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cad0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
cae0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
caf0: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  l..**.** This is
cb00: 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79   similar to play
cb10: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61  ing back the tra
cb20: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
cb30: 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66   but with.** a f
cb40: 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e  ew extra twists.
cb50: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
cb60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
cb70: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
cb80: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
cb90: 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  tart of.**      
cba0: 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74     the statement
cbb0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50   is stored in pP
cbc0: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20  ager->stmtSize, 
cbd0: 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  not in the.**   
cbe0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
cbf0: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  le itself..**.**
cc00: 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69      (2)  In addi
cc10: 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20  tion to playing 
cc20: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
cc30: 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f  nt journal, also
cc40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79  .**         play
cc50: 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f  back all pages o
cc60: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
cc70: 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e  n journal beginn
cc80: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ing.**         a
cc90: 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  t offset pPager-
cca0: 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73  >stmtJSize..*/.s
ccb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
ccc0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61  stmt_playback(Pa
ccd0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
cce0: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
ccf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
cd00: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75   of the full jou
cd10: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64  rnal */.  i64 hd
cd20: 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rOff;.  int nRec
cd30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
cd50: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
cd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd70: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
cd80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
cd90: 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  ..  szJ = pPager
cda0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69  ->journalOff;.#i
cdb0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20  fndef NDEBUG .  
cdc0: 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a  {.    i64 os_szJ
cdd0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
cde0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
cdf0: 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a  ger->jfd, &os_sz
ce00: 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  J);.    if( rc!=
ce10: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
ce20: 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  rn rc;.    asser
ce30: 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29  t( szJ==os_szJ )
ce40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
ce50: 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f  /* Set hdrOff to
ce60: 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a   be the offset j
ce70: 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e  ust after the en
ce80: 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f  d of the last jo
ce90: 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  urnal.  ** page 
cea0: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74  written before t
ceb0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
cec0: 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73  -header for this
ced0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
cee0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
cef0: 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20  written, or the 
cf00: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
cf10: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
cf20: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
cf30: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
cf40: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
cf50: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
cf60: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
cf70: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
cf80: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
cf90: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
cfa0: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
cfb0: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
cfc0: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
cfd0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
cfe0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ze..  */.  if( p
cff0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
d000: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
d010: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
d020: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
d030: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
d040: 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
d050: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
d060: 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
d070: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
d080: 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
d090: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Size;..  /* Figu
d0a0: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
d0b0: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
d0c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d0d0: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
d0e0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
d0f0: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
d100: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
d110: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
d120: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
d130: 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67  );.  nRec = pPag
d140: 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20  er->stmtNRec;.  
d150: 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69  .  /* Copy origi
d160: 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
d170: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d180: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
d190: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
d1a0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
d1b0: 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
d1c0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d  ement journal om
d1d0: 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72  its checksums fr
d1e0: 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63  om.  ** each rec
d1f0: 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d  ord since power-
d200: 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79  failure recovery
d210: 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e   is not importan
d220: 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20  t to statement. 
d230: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20   ** journals..  
d240: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d  */.  for(i=nRec-
d250: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
d260: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d270: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d280: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d290: 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73  stfd, 0);.    as
d2a0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
d2b0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
d2c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d2d0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d2e0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
d2f0: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65  /* Now roll some
d300: 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d   pages back from
d310: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
d320: 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e   journal. Pager.
d330: 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77  stmtJSize.  ** w
d340: 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  as the size of t
d350: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d360: 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  when this statem
d370: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c  ent was started,
d380: 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68   so.  ** everyth
d390: 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e  ing after that n
d3a0: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
d3b0: 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69  d back, either i
d3c0: 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  nto the.  ** dat
d3d0: 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72  abase, the memor
d3e0: 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68  y cache, or both
d3f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
d400: 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74  t is not zero, t
d410: 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64  hen Pager.stmtHd
d420: 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73  rOff is the offs
d430: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
d440: 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
d450: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
d460: 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20   written during 
d470: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
d480: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
d490: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
d4a0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
d4b0: 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  d, pPager->stmtJ
d4c0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
d4d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d4e0: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
d4f0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
d500: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d510: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
d520: 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  tJSize;.  pPager
d530: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50  ->cksumInit = pP
d540: 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b  ager->stmtCksum;
d550: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
d560: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 68  ->journalOff < h
d570: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63 20  drOff ){.    rc 
d580: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
d590: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
d5a0: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
d5b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d5c0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d5d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d5e0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d5f0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d600: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
d610: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d620: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
d630: 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
d640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d650: 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
d660: 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
d670: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
d680: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
d690: 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
d6a0: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
d6b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d6c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d6d0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d6e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
d6f0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
d700: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
d710: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
d720: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
d730: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d740: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
d750: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
d760: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
d770: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
d780: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
d790: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
d7a0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
d7b0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
d7c0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
d7d0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  fd, 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 20 20 69  _DONE );.      i
d800: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d810: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d820: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
d830: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
d840: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
d850: 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c  ;.  .end_stmt_pl
d860: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
d870: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20  ==SQLITE_OK) {. 
d880: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
d890: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
d8a0: 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64   /* pager_reload
d8b0: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20  _cache(pPager); 
d8c0: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
d8d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
d8e0: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
d8f0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
d900: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
d910: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
d920: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
d930: 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
d940: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d950: 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
d960: 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20  xPage>10 ){.    
d970: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
d980: 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65   mxPage;.  }else
d990: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
d9a0: 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d  Page = 10;.  }.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
d9c0: 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
d9d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
d9e0: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
d9f0: 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
da00: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
da10: 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
da20: 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
da30: 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
da40: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
da50: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
da60: 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
da70: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
da80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
da90: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
daa0: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
dab0: 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
dac0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
dad0: 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
dae0: 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
daf0: 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
db00: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
db10: 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
db20: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
db30: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
db40: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
db50: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
db60: 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
db70: 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
db80: 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
db90: 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
dba0: 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
dbb0: 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
dbc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
dbd0: 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
dbe0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
dbf0: 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
dc00: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
dc10: 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
dc20: 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
dc30: 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
dc40: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
dc60: 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
dc70: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
dc80: 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
dc90: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
dca0: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
dcb0: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
dcd0: 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
dce0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
dcf0: 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
dd00: 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
dd10: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
dd20: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
dd30: 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
dd40: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
dd50: 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
dd60: 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
dd70: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
dd80: 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
dd90: 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
dda0: 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
ddb0: 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
ddc0: 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
dde0: 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
ddf0: 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
de00: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
de10: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
de20: 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
de30: 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
de40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
de50: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
de60: 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
de70: 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
de80: 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
de90: 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
dea0: 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
deb0: 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
dec0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
ded0: 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
dee0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
def0: 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
df00: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
df10: 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73  vel, int full_fs
df20: 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
df30: 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
df40: 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
df50: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
df60: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76  ->fullSync = lev
df70: 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
df80: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
df90: 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
dfa0: 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20   = full_fsync;. 
dfb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
dfc0: 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
dfd0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65  edSync = 0;.}.#e
dfe0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
dff0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
e000: 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
e010: 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
e020: 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
e030: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
e040: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
e050: 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
e060: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
e070: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
e080: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
e090: 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
e0a0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
e0b0: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
e0c0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
e0d0: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
e0e0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a  porary file. .**
e0f0: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
e100: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
e110: 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
e120: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e130: 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
e140: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
e150: 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a   if we fail..**.
e160: 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  ** The OS will a
e170: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
e180: 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
e190: 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
e1a0: 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  s.** closed..*/.
e1b0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
e1c0: 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
e1d0: 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20  OsFile **pFd){. 
e1e0: 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20   int cnt = 8;.  
e1f0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
e200: 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d 50  File[SQLITE_TEMP
e210: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66  NAME_SIZE];..#if
e220: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
e230: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
e240: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
e250: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
e260: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
e270: 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 64  ly */.#endif.  d
e280: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
e290: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
e2a0: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
e2b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e2c0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
e2d0: 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a  zFile, pFd, 1);.
e2e0: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
e2f0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
e300: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
e310: 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e  OMEM );.  return
e320: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
e330: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
e340: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
e350: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
e360: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
e370: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
e380: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
e390: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
e3a0: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
e3b0: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
e3c0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
e3d0: 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
e3e0: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
e3f0: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
e400: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
e410: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
e420: 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
e430: 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Unref()..**.** I
e440: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
e450: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
e460: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
e470: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
e480: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
e490: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
e4a0: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
e4b0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
e4c0: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
e4d0: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
e4e0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
e4f0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
e500: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
e510: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
e520: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
e530: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
e540: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
e550: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
e560: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
e570: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
e580: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
e590: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e5a0: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
e5b0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
e5c0: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
e5d0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
e5e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e5f0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
e600: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
e610: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
e620: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
e630: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
e640: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
e650: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
e660: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
e670: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
e680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
e690: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
e6a0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
e6b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e6c0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
e6d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
e6e0: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20  .  int nameLen; 
e6f0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20   /* Compiler is 
e700: 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61  wrong. This is a
e710: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
e720: 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a  d before use */.
e730: 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20    OsFile *fd;.  
e740: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e750: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
e760: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
e770: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
e780: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
e790: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
e7a0: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
e7b0: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
e7c0: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
e7d0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
e7e0: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
e7f0: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63  EADLOCK)!=0;.  c
e800: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
e810: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
e820: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e830: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
e840: 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
e850: 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
e860: 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
e870: 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
e880: 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
e890: 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
e8a0: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
e8b0: 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
e8c0: 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
e8d0: 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
e8e0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
e8f0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
e900: 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
e910: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
e920: 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
e930: 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
e940: 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
e950: 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62   set. It would b
e960: 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74  e nice to assert
e970: 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61  .  ** that Threa
e980: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20  dData.nAlloc is 
e990: 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c  non-zero, but al
e9a0: 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74  as this breaks t
e9b0: 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20  est cases .  ** 
e9c0: 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b  written to invok
e9d0: 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65  e the pager dire
e9e0: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72  ctly..  */.  Thr
e9f0: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
ea00: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
ea10: 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
ea20: 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd );.#endif.. 
ea30: 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29 20   /* If malloc() 
ea40: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c  has already fail
ea50: 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ed return SQLITE
ea60: 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20 65  _NOMEM. Before e
ea70: 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e 67  ven.  ** testing
ea80: 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20 2a   for this, set *
ea90: 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c 20  ppPager to NULL 
eaa0: 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b 6e  so the caller kn
eab0: 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  ows the pager.  
eac0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77 61 73  ** structure was
ead0: 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65 64   never allocated
eae0: 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61 67  . .  */.  *ppPag
eaf0: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  er = 0;.  if( sq
eb00: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
eb10: 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d() ){.    retur
eb20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
eb30: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66 64    }.  memset(&fd
eb40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29 29  , 0, sizeof(fd))
eb50: 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
eb60: 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20   pager file and 
eb70: 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  set zFullPathnam
eb80: 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61  e to point at ma
eb90: 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d  lloc()ed .  ** m
eba0: 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  emory containing
ebb0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69   the complete fi
ebc0: 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63  lename (i.e. inc
ebd0: 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63  luding the direc
ebe0: 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  tory)..  */.  if
ebf0: 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
ec00: 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23  Filename[0] ){.#
ec10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ec20: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
ec30: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
ec40: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
ec50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
ec60: 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46  Db = 1;.      zF
ec70: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
ec80: 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a  liteStrDup("");.
ec90: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
eca0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
ecb0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ecc0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
ecd0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
ece0: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
ecf0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ed00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ed10: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
ed20: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
ed30: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
ed40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
ed50: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
ed60: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
ed70: 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  mp(&fd);.    sql
ed80: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
ed90: 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a  me(zTemp);.    z
eda0: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
edb0: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
edc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
edd0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
ede0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
edf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ee00: 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
ee10: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
ee20: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
ee30: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
ee40: 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  e. As part of th
ee50: 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f  e same allocatio
ee60: 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  n, allocate.  **
ee70: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66   space for the f
ee80: 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65  ull paths of the
ee90: 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79   file, directory
eea0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   and journal .  
eeb0: 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e  ** (Pager.zFilen
eec0: 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65  ame, Pager.zDire
eed0: 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e  ctory and Pager.
eee0: 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a  zJournal)..  */.
eef0: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
ef00: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c  ame ){.    nameL
ef10: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
ef20: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ef30: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
ef40: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
ef50: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
ef60: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20 69  *3 + 30 );.    i
ef70: 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d  f( pPager && rc=
ef80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ef90: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
efa0: 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29  Space = (char *)
efb0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
efc0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
efd0: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
efe0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61  .  }...  /* If a
eff0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
f000: 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
f010: 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
f020: 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a  ree the memory .
f030: 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
f040: 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  by zFullPathname
f050: 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72  , free the Pager
f060: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
f070: 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  lose the .  ** f
f080: 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70  ile. Since the p
f090: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
f0a0: 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
f0b0: 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
f0c0: 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
f0d0: 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
f0e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
f0f0: 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74  ger || !zFullPat
f100: 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65 72  hname || !pPager
f110: 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20 72  ->pTmpSpace || r
f120: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f130: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
f140: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
f150: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
f160: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  hname);.    sqli
f170: 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
f180: 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
f190: 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
f1a0: 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
f1b0: 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  }..  PAGERTRACE3
f1c0: 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
f1d0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
f1e0: 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ), zFullPathname
f1f0: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
f200: 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
f210: 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  ager, zFullPathn
f220: 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d 3e  ame)).  pPager->
f230: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
f240: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
f250: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f260: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
f270: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
f280: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
f290: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
f2a0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
f2b0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
f2c0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
f2d0: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
f2e0: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
f2f0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
f300: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
f310: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65  );..  for(i=name
f320: 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67  Len; i>0 && pPag
f330: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
f340: 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  -1]!='/'; i--){}
f350: 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61  .  if( i>0 ) pPa
f360: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
f370: 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63  i-1] = 0;.  strc
f380: 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
f390: 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  nal, zFullPathna
f3a0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
f3b0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
f3c0: 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67  ;.  strcpy(&pPag
f3d0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d  er->zJournal[nam
f3e0: 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  eLen], "-journal
f3f0: 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ");.  pPager->fd
f400: 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67   = fd;.  /* pPag
f410: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
f420: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f430: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
f440: 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65  seJournal && !me
f450: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  mDb;.  pPager->n
f460: 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65  oReadlock = noRe
f470: 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
f480: 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
f490: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
f4a0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
f4b0: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
f4c0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
f4d0: 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
f4e0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
f4f0: 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
f500: 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49  >pageSize = SQLI
f510: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
f520: 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65  SIZE;.  /* pPage
f530: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
f540: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f550: 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
f560: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f570: 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
f580: 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  /* pPager->nMaxP
f590: 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
f5a0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
f5b0: 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41  00;.  assert( PA
f5c0: 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b  GER_UNLOCK==0 );
f5d0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
f5e0: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
f5f0: 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  CK; */.  /* pPag
f600: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
f610: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
f620: 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
f630: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
f640: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
f650: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
f660: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
f670: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
f680: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f690: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
f6a0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
f6b0: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
f6c0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
f6d0: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
f6e0: 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61  c?0:1);.  /* pPa
f6f0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
f700: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f710: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
f720: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
f730: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
f740: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
f750: 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
f760: 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 61  ENT(nExtra);.  a
f770: 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44 62 29  ssert(fd||memDb)
f780: 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29  ;.  if( !memDb )
f790: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
f7a0: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
f7b0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
f7c0: 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  d);.  }.  /* pPa
f7d0: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
f7e0: 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  r = 0; */.  /* m
f7f0: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
f800: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
f810: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
f820: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
f830: 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53  pPager;.#ifdef S
f840: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
f850: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
f860: 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d   pPager->pNext =
f870: 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20   pTsd->pPager;. 
f880: 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20   pTsd->pPager = 
f890: 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20  pPager;.#endif. 
f8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f8b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
f8c0: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
f8d0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
f8e0: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
f8f0: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61  etBusyhandler(Pa
f900: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73  ger *pPager, Bus
f910: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
f920: 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65  andler){.  pPage
f930: 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
f940: 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = pBusyHandler;.
f950: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f960: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
f970: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
f980: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65  not NULL, the de
f990: 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c  structor is call
f9a0: 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72  ed.** when the r
f9b0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
f9c0: 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63  n each page reac
f9d0: 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64  hes zero.  The d
f9e0: 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a  estructor can.**
f9f0: 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61   be used to clea
fa00: 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  n up information
fa10: 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65   in the extra se
fa20: 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74  gment appended t
fa30: 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a  o each page..**.
fa40: 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f  ** The destructo
fa50: 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20  r is not called 
fa60: 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69  as a result sqli
fa70: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
fa80: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
fa90: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
faa0: 64 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  d by sqlite3Page
fab0: 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69  rUnref()..*/.voi
fac0: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
fad0: 74 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  tDestructor(Page
fae0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
faf0: 28 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a  (*xDesc)(DbPage*
fb00: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
fb10: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->xDestructor = 
fb20: 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xDesc;.}../*.** 
fb30: 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
fb40: 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
fb50: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
fb60: 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
fb70: 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
fb80: 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
fb90: 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
fba0: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
fbb0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
fbc0: 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
fbd0: 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
fbe0: 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
fbf0: 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
fc00: 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
fc10: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
fc20: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
fc30: 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
fc40: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
fc50: 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
fc60: 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
fc70: 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
fc80: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
fc90: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
fca0: 69 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  it)(DbPage*,int)
fcb0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
fcc0: 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
fcd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
fce0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52  he page size.  R
fcf0: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69  eturn the new si
fd00: 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67  ze.  If the sugg
fd10: 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20  est new page.** 
fd20: 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70  size is inapprop
fd30: 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
fd40: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
fd50: 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64  size is selected
fd60: 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64  .** and returned
fd70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fd80: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
fd90: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fda0: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
fdb0: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
fdc0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
fdd0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
fde0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66  AGE_SIZE );.  if
fdf0: 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  ( !pPager->memDb
fe00: 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   && pPager->nRef
fe10: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ==0 ){.    pager
fe20: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
fe30: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
fe40: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
fe50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d  .    pPager->pTm
fe60: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
fe70: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50  ReallocOrFree(pP
fe80: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c  ager->pTmpSpace,
fe90: 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a   pageSize);.  }.
fea0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
feb0: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
fec0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
fed0: 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
fee0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
fef0: 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
ff00: 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
ff10: 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
ff20: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
ff30: 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
ff40: 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
ff50: 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
ff60: 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
ff70: 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
ff80: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
ff90: 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
ffa0: 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
ffb0: 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
ffc0: 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
ffd0: 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
ffe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
fff0: 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
10000 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
10010 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
10020 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
10030 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
10040 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
10050 69 64 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74  id clear_simulat
10060 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20  ed_io_error(){. 
10070 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
10080 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69  r_hit = 0;.}.voi
10090 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
100a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
100b0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
100c0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
100d0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
100e0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
100f0 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
10100 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
10110 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10120 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
10130 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
10140 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
10150 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
10160 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
10170 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20 64 65 66  io_error().# def
10180 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
10190 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
101a0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
101b0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
101c0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
101d0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
101e0 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
101f0 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
10200 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
10210 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
10220 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
10230 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72   .**.** No error
10240 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
10250 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20  e. The rational 
10260 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
10270 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   this function .
10280 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ** may be called
10290 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
102a0 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
102b0 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65   or contain a he
102c0 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65  ader. In .** the
102d0 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33  se cases sqlite3
102e0 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65  OsRead() will re
102f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74  turn an error, t
10300 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  o which the corr
10310 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65  ect .** response
10320 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20   is to zero the 
10330 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20  memory at pDest 
10340 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41  and continue.  A
10350 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a   real IO error .
10360 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62  ** will presumab
10370 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20  ly recur and be 
10380 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20  picked up later 
10390 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f  (Todo: Think abo
103a0 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74  ut this)..*/.int
103b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
103c0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
103d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
103e0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
103f0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
10400 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10410 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
10420 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  , N);.  if( MEMD
10430 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61  B==0 ){.    disa
10440 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10450 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
10460 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
10470 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
10480 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
10490 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
104a0 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
104b0 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
104c0 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
104d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
104e0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
104f0 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28  est, N);.    if(
10500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
10510 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
10520 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
10530 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
10540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10550 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10560 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
10570 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
10580 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
10590 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
105a0 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
105b0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
105c0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
105d0 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
105e0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
105f0 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
10600 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
10610 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
10620 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
10630 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
10640 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
10650 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
10660 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
10670 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
10680 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
10690 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
106a0 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
106b0 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
106c0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
106d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
106e0 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72    i64 n;.  int r
106f0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
10700 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
10710 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
10720 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
10730 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
10740 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
10750 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
10760 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
10770 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d   {.    if( (rc =
10780 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10790 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
107a0 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
107b0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
107c0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
107d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
107e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
107f0 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
10800 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
10810 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
10820 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
10830 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10840 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10850 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
10860 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
10870 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10880 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
10890 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
108a0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
108b0 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
108c0 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74    n++;.  }.  ret
108d0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
108e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
108f0 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
10900 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
10910 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
10920 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
10930 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
10940 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
10950 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
10960 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
10970 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
10980 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
10990 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
109a0 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
109b0 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
109c0 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
109d0 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
109e0 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
109f0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
10a00 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
10a10 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
10a20 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
10a30 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
10a40 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
10a50 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
10a60 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
10a70 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
10a80 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
10a90 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
10aa0 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
10ab0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
10ac0 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
10ad0 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
10ae0 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
10af0 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
10b00 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
10b10 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
10b20 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
10b30 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
10b40 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
10b50 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
10b60 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
10b70 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
10b80 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
10b90 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
10ba0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
10bb0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
10bc0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
10bd0 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
10be0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
10bf0 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
10c00 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
10c10 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
10c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
10c30 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e  ger->aHash[pPg->
10c40 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
10c50 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29  nHash-1)]!=pPg )
10c60 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
10c70 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
10c80 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
10c90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10ca0 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  nt h = pPg->pgno
10cb0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
10cc0 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72  h-1);.    pPager
10cd0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
10ce0 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
10cf0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
10d00 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
10d10 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
10d20 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
10d30 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  }.  pPg->pgno = 
10d40 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
10d50 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
10d60 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
10d70 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
10d80 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
10d90 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
10da0 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
10db0 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
10dc0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
10dd0 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
10de0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
10df0 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
10e00 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
10e10 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
10e20 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  ager;..  /* Keep
10e30 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65   the pFirstSynce
10e40 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  d pointer pointi
10e50 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ng at the first 
10e60 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67  synchronized pag
10e70 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d  e */.  if( pPg==
10e80 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
10e90 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
10ea0 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
10eb0 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65  tFree;.    while
10ec0 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
10ed0 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
10ee0 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50  xtFree; }.    pP
10ef0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10f00 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = p;.  }..  /
10f10 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
10f20 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
10f30 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
10f40 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
10f50 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
10f60 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
10f70 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
10f80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10f90 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
10fa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  ;.    pPager->pF
10fb0 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
10fc0 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28  tFree;.  }.  if(
10fd0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
10fe0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
10ff0 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
11000 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11010 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
11020 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11030 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
11040 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
11050 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
11060 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
11070 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  xtFree = pPg->pP
11080 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  revFree = 0;..  
11090 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
110a0 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
110b0 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  le */.  unlinkHa
110c0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
110d0 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pPg);.}..#ifndef
110e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
110f0 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORYDB./*.** This
11100 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
11110 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20   to truncate an 
11120 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
11130 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61  se.  Delete.** a
11140 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
11150 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68  gno is larger th
11160 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
11170 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
11180 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65  enced..** Refere
11190 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
111a0 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
111b0 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
111c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
111d0 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
111e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
111f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
11200 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
11210 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
11220 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
11230 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
11240 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
11250 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
11260 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
11270 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
11280 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
11290 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
112a0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
112b0 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
112c0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
112d0 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
112e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
112f0 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
11300 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
11310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
11320 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
11330 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69  tAll;.      unli
11340 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
11350 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
11360 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
11370 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
11380 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b  pPager->nPage--;
11390 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
113a0 73 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72  se.#define memor
113b0 79 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e  yTruncate(p).#en
113c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  dif../*.** Try t
113d0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
113e0 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
113f0 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
11400 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
11410 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
11420 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
11430 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
11440 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
11450 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
11460 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
11470 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
11480 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
11490 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
114a0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
114b0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
114c0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
114d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
114e0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
114f0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
11500 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
11510 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
11520 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
11530 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
11540 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
11550 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
11560 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
11570 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
11580 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
11590 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
115a0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
115b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
115c0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
115d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
115e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
115f0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
11600 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
11610 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
11620 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
11630 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
11640 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
11650 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
11660 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a  <0 || MEMDB );..
11670 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
11680 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
11690 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
116a0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
116b0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
116c0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
116d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
116e0 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
116f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
11700 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
11710 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
11720 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
11730 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
11740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11750 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
11760 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
11770 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
11780 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
11790 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
117a0 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
117b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
117c0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
117d0 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
117e0 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
117f0 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
11800 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
11810 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
11820 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
11830 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
11840 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
11850 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
11860 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c  | MEMDB );.  sql
11870 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
11880 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
11890 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
118a0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
118b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
118c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
118d0 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
118e0 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
118f0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
11900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11910 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
11920 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
11930 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
11940 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
11950 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
11960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11970 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e  ;.  }.  rc = syn
11980 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
11990 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
119a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
119b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
119c0 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
119d0 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
119e0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
119f0 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20  runcating. */.  
11a00 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
11a10 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
11a20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
11a30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
11a50 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63  rn rc;.  }..  rc
11a60 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
11a70 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29  e(pPager, nPage)
11a80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
11a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
11aa0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
11ab0 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  age;.  }.  retur
11ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
11ad0 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
11ae0 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
11af0 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
11b00 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
11b10 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
11b20 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
11b30 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
11b40 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11b50 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
11b60 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
11b70 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
11b80 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
11b90 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
11ba0 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
11bb0 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
11bc0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
11bd0 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
11be0 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
11bf0 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
11c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
11c10 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
11c20 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
11c30 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
11c40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
11c50 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
11c60 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
11c70 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
11c80 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
11c90 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
11ca0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11cb0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
11cc0 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
11cd0 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
11ce0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11cf0 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
11d00 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
11d10 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
11d20 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
11d30 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
11d40 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
11d50 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11d60 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
11d70 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
11d80 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
11d90 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
11da0 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
11db0 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
11dc0 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
11dd0 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
11de0 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
11df0 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
11e00 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
11e10 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
11e20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
11e30 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
11e40 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
11e50 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
11e60 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
11e70 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
11e80 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
11e90 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
11ea0 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
11eb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11ec0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
11ed0 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c  sd && pTsd->nAll
11ee0 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  oc );.#endif..  
11ef0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
11f00 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
11f10 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11f20 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
11f30 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
11f40 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
11f50 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
11f60 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
11f70 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
11f80 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
11f90 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
11fa0 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
11fb0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
11fc0 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
11fd0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
11fe0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73  ", pPager)).  as
11ff0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
12000 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
12010 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
12020 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
12030 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
12040 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
12050 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
12060 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
12070 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
12080 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12090 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
120a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
120b0 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
120c0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
120d0 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
120e0 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
120f0 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
12100 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
12110 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
12120 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
12130 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
12140 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
12150 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
12160 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
12170 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
12180 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66  * }.  */..#ifdef
12190 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
121a0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
121b0 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
121c0 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20   pager from the 
121d0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
121e0 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  agers starting a
121f0 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61  t .  ** ThreadDa
12200 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d  ta.pPager if mem
12210 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
12220 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a  s enabled..  */.
12230 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54    if( pPager==pT
12240 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  sd->pPager ){.  
12250 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
12260 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
12270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67    }else{.    Pag
12280 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f  er *pTmp;.    fo
12290 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70  r(pTmp = pTsd->p
122a0 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65  Pager; pTmp->pNe
122b0 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70  xt!=pPager; pTmp
122c0 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  =pTmp->pNext){}.
122d0 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20      pTmp->pNext 
122e0 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
122f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
12300 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
12310 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74  >aHash);.  sqlit
12320 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
12330 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
12340 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
12350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12360 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
12370 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
12380 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
12390 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
123a0 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
123b0 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
123c0 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ge *p){.  return
123d0 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a   p->pgno;.}../*.
123e0 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
123f0 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
12400 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
12410 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
12420 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
12430 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
12440 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
12450 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
12460 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
12470 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
12480 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
12490 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
124a0 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
124b0 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
124c0 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
124d0 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
124e0 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
124f0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
12500 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
12510 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
12520 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
12530 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
12540 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
12550 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
12560 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
12570 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
12580 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
12590 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
125a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
125b0 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
125c0 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
125d0 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
125e0 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70  /.    if( pPg==p
125f0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
12600 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
12610 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
12620 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
12630 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
12640 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
12650 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
12660 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
12670 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12680 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  d = p;.    }.   
12690 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
126a0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
126b0 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
126c0 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
126d0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
126e0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
126f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
12700 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
12710 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12720 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
12730 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
12740 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
12750 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
12760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12770 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12780 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
12790 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
127a0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
127b0 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
127c0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
127d0 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64  NFO(pPg);.}.#ifd
127e0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
127f0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
12800 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
12810 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
12820 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
12830 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
12840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12850 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
12860 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
12870 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
12880 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
12890 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
128a0 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
128b0 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
128c0 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
128d0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
128e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
128f0 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
12900 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
12910 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
12920 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
12930 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
12940 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
12950 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70  bPage *pPg){.  p
12960 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
12970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
12990 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
129a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
129b0 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
129c0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
129d0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
129e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
129f0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
12a00 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
12a10 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
12a20 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
12a30 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
12a40 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
12a50 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
12a60 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
12a70 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
12a80 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
12a90 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
12aa0 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
12ab0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
12ac0 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
12ad0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
12ae0 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
12af0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
12b00 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
12b10 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
12b20 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
12b30 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
12b40 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
12b50 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
12b60 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
12b70 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
12b80 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
12b90 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
12ba0 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
12bb0 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
12bc0 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
12bd0 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
12be0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
12bf0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
12c00 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
12c10 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
12c20 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
12c30 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
12c40 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
12c50 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
12c60 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
12c70 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
12c80 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
12c90 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
12ca0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
12cb0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
12cc0 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
12cd0 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
12ce0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
12cf0 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
12d00 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73  er failure, so s
12d10 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
12d20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12d30 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
12d40 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
12d50 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
12d60 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
12d70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12d80 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
12d90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
12da0 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
12db0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12dc0 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
12dd0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
12de0 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
12df0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
12e00 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
12e10 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
12e20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
12e30 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
12e40 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
12e50 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
12e60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12e70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
12e80 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
12e90 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f  lOpen );.      /
12ea0 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65  * assert( !pPage
12eb0 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20  r->noSync ); // 
12ec0 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20  noSync might be 
12ed0 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  set if synchrono
12ee0 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  us.      ** was 
12ef0 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72  turned off after
12f00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12f10 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54   was started.  T
12f20 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69  icket #615 */.#i
12f30 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
12f40 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
12f50 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50  Make sure the pP
12f60 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74  ager->nRec count
12f70 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e  er we are keepin
12f80 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20  g agrees.       
12f90 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65   ** with the nRe
12fa0 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
12fb0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
12fd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
12fe0 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20   i64 jSz;.      
12ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13000 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
13010 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20  >jfd, &jSz);.   
13020 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
13030 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13040 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13050 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13060 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  jSz );.      }.#
13070 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
13080 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
13090 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
130a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
130b0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
130c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
130d0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
130e0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
130f0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
13100 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
13110 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
13120 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
13130 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
13140 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
13150 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
13160 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
13170 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
13180 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ck. .        */.
13190 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
131a0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
131b0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
131c0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
131d0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
131e0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
131f0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
13200 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
13210 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
13220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13230 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
13240 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
13250 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
13260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13270 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
13280 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
13290 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
132c0 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
132d0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
132e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
132f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13300 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
13310 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
13320 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20  \n", pPager,.   
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
13350 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
13360 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20  nalMagic), 4)). 
13370 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
13380 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
13390 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
133a0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
133b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
133c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
133d0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
133e0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
133f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
13400 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
13410 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13420 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
13430 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
13440 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
13450 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
13460 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
13470 59 4e 43 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  YNC %d\n", pPage
13480 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r)).      rc = s
13490 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
134a0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
134b0 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
134c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
134d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
134e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
134f0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
13500 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
13510 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
13520 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
13530 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
13540 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
13550 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
13560 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
13570 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
13580 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
13590 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
135a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
135b0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
135c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
135d0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
135e0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
135f0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
13600 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
13610 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
13620 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
13630 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
13640 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
13650 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
13660 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
13670 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
13680 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
13690 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
136a0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
136b0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
136c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
136d0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
136e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
136f0 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
13700 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
13710 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
13720 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
13730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
13740 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
13750 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
13760 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
13770 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
13780 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
13790 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
137a0 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
137b0 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
137c0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
137d0 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
137e0 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
137f0 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
13800 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
13810 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
13820 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
13830 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
13840 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
13850 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
13860 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
13870 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
13880 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13890 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
138a0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
138b0 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
138c0 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
138d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
138e0 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
138f0 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
13900 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
13910 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
13920 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
13930 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
13940 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
13950 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
13960 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
13970 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
13980 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
13990 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
139a0 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
139b0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
139c0 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
139d0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
139e0 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
139f0 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
13a00 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
13a10 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 32 35 0a  _SORT_BUCKET 25.
13a20 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
13a30 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
13a40 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
13a50 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
13a60 54 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  T], *p;.  int i;
13a70 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20  .  memset(a, 0, 
13a80 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68  sizeof(a));.  wh
13a90 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20  ile( pIn ){.    
13aa0 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e  p = pIn;.    pIn
13ab0 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
13ac0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
13ad0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13ae0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b  N_SORT_BUCKET-1;
13af0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
13b00 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
13b10 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
13b20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b40 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
13b50 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
13b60 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b         a[i] = 0;
13b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13b80 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54     if( i==N_SORT
13b90 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20  _BUCKET-1 ){.   
13ba0 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f     a[i] = merge_
13bb0 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70  pagelist(a[i], p
13bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
13bd0 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69   = a[0];.  for(i
13be0 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =1; i<N_SORT_BUC
13bf0 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  KET; i++){.    p
13c00 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
13c10 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a  t(p, a[i]);.  }.
13c20 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
13c30 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73  *.** Given a lis
13c40 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e  t of pages (conn
13c50 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48  ected by the PgH
13c60 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
13c70 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72  r) write.** ever
13c80 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  y one of those p
13c90 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20  ages out to the 
13ca0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
13cb0 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a  d mark them all.
13cc0 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a  ** as clean..*/.
13cd0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
13ce0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
13cf0 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
13d00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
13d10 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
13d20 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
13d30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13d40 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
13d50 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
13d60 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
13d70 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
13d80 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
13d90 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
13da0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
13db0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
13dc0 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
13dd0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
13de0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
13df0 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
13e00 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
13e10 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
13e20 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
13e30 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
13e40 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
13e50 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
13e60 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
13e70 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
13e80 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
13e90 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
13ea0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
13eb0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
13ec0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
13ed0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
13ee0 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
13ef0 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
13f00 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
13f10 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
13f20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
13f30 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
13f40 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
13f50 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
13f60 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
13f70 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
13f80 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
13f90 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
13fa0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
13fb0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
13fc0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
13fd0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
13fe0 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
13ff0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
14000 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
14010 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
14020 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
14030 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
14040 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
14050 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
14060 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
14070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
14080 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
14090 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
140a0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
140b0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
140c0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
140d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
140e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
140f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
14100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14110 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
14120 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73   rc;.  }..  pLis
14130 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69 73  t = sort_pagelis
14140 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c  t(pList);.  whil
14150 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  e( pList ){.    
14160 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64  assert( pList->d
14170 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d  irty );.    rc =
14180 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
14190 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73  Pager->fd, (pLis
141a0 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  t->pgno-1)*(i64)
141b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
141c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
141d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f  return rc;.    /
141e0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
141f0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
14200 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
14210 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
14220 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
14230 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
14240 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
14250 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
14260 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
14270 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
14280 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
14290 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
142a0 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
142b0 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
142c0 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
142d0 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
142e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
142f0 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
14300 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
14310 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
14320 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
14330 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
14340 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
14350 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50 41  no, 6);.      PA
14360 47 45 52 54 52 41 43 45 33 28 22 53 54 4f 52 45  GERTRACE3("STORE
14370 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
14380 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
14390 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
143a0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
143b0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
143c0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
143d0 6e 6f 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20  no)).      rc = 
143e0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
143f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
14400 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
14410 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53 54 5f  ze);.      TEST_
14420 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
14430 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ite);.    }.#ifn
14440 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
14450 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
14460 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20  TRACE3("NOSTORE 
14470 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
14480 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
14490 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
144a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
144b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
144c0 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69  c;.    pList->di
144d0 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rty = 0;.#ifdef 
144e0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
144f0 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
14500 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
14510 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
14520 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
14530 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
14540 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14550 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14560 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79  ** Collect every
14570 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f   dirty page into
14580 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e   a dirty list an
14590 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
145a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
145b0 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20  d of that list. 
145c0 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a   All pages are.*
145d0 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e  * collected even
145e0 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69   if they are sti
145f0 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  ll in use..*/.st
14600 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
14610 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
14620 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61  pages(Pager *pPa
14630 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
14640 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d  Pager->pDirty;.}
14650 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
14660 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73 20  RUE if there is 
14670 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e  a hot journal on
14680 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
14690 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e  ..** A hot journ
146a0 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e  al is one that n
146b0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
146c0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d back..**.** If
146d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
146e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
146f0 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
14700 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
14710 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
14720 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
14730 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
14740 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
14750 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
14760 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
14770 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68    Just delete th
14780 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  e journal..*/.st
14790 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
147a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
147b0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
147c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
147d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
147e0 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  f( !sqlite3OsFil
147f0 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
14800 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65 74 75  zJournal) ) retu
14810 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
14820 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
14830 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
14840 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
14850 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
14860 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
14870 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  r)==0 ){.    sql
14880 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
14890 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
148a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
148b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
148c0 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
148d0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
148e0 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
148f0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
14900 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  cycled. .**.** T
14910 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
14920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
14930 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ERR, SQLITE_FULL
14940 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49   or SQLITE_OK. I
14950 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  t .** does not s
14960 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  et the pPager->e
14970 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
14980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14990 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67  ager_recycle(Pag
149a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
149b0 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a  syncOk, PgHdr **
149c0 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  ppPg){.  PgHdr *
149d0 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30  pPg;.  *ppPg = 0
149e0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
149f0 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
14a00 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
14a10 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
14a20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
14a30 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
14a40 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
14a50 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
14a60 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
14a70 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
14a80 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
14a90 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
14aa0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
14ab0 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
14ac0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
14ad0 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
14ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
14af0 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
14b00 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
14b10 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
14b20 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
14b30 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
14b40 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
14b50 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
14b60 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
14b70 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26  pPager->pFirst &
14b80 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d  & syncOk && !MEM
14b90 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  DB){.    int rc 
14ba0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
14bb0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
14bc0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
14bd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
14be0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
14bf0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
14c00 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
14c10 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ync mode, write 
14c20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65  a new journal he
14c30 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ader into the.  
14c40 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
14c50 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
14c60 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
14c70 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
14c80 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61  nal.      ** hea
14c90 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
14ca0 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
14cb0 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
14cc0 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  at have.      **
14cd0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
14ce0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
14cf0 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
14d00 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20  he header is.   
14d10 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68     ** trashed wh
14d20 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
14d30 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20  d is updated).. 
14d40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
14d50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
14d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14d70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14d80 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73   > 0 );.      as
14d90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
14da0 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
14db0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
14dc0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
14dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14de0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
14df0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
14e00 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
14e10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
14e20 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
14e30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
14e40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14e50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
14e60 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
14e70 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
14e80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14e90 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
14ea0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
14eb0 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
14ec0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
14ed0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
14ee0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
14ef0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
14f00 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
14f10 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
14f20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
14f30 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
14f40 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69  st( pPg );.    i
14f50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14f60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14f70 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
14f80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
14f90 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
14fa0 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
14fb0 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
14fc0 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
14fd0 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
14fe0 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
14ff0 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
15000 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
15010 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
15020 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c  sqlite_dont_roll
15030 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
15040 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
15050 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
15060 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73  tion..  ** It is
15070 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f   necessary to do
15080 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68   this because th
15090 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  e page marked al
150a0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a  waysRollback.  *
150b0 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61  * might be reloa
150c0 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74  ded at a later t
150d0 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20  ime but at that 
150e0 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72  point we won't r
150f0 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61  emember.  ** tha
15100 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
15110 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
15120 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
15130 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
15140 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
15150 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
15160 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
15170 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
15180 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
15190 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  k ){.    IOTRACE
151a0 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41  (("ALWAYS_ROLLBA
151b0 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
151c0 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  )).    pPager->a
151d0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
151e0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  1;.  }..  /* Unl
151f0 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
15200 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
15210 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
15220 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e   table.  */.  un
15230 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
15240 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
15250 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70  r->nOvfl);..  *p
15260 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
15270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15290 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
152a0 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
152b0 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
152c0 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
152d0 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
152e0 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
152f0 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
15300 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
15310 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
15320 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15330 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
15340 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  Free()ed..**.** 
15350 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
15360 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
15370 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
15380 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
15390 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
153a0 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
153b0 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67  n returns. A neg
153c0 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20  ative value for 
153d0 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72  nReq means.** fr
153e0 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
153f0 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54  y as possible. T
15400 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
15410 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
15420 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
15430 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
15440 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
15450 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
15460 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69  ORY_MANAGEMENT.i
15470 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
15480 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69 6e 74  eleaseMemory(int
15490 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20   nReq){.  const 
154a0 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64  ThreadData *pTsd
154b0 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  ro = sqlite3Thre
154c0 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29  adDataReadOnly()
154d0 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20 20  ;.  Pager *p;.  
154e0 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
154f0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
15500 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f  * If the the glo
15510 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c  bal mutex is hel
15520 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  d, this subrouti
15530 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a  ne becomes a.  *
15540 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74  * o-op; zero byt
15550 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65  es of memory are
15560 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73   freed.  This is
15570 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f   because.  ** so
15580 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69  me of the code i
15590 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66  nvoked by this f
155a0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f  unction may also
155b0 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74  .  ** try to obt
155c0 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72  ain the mutex, r
155d0 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65  esulting in a de
155e0 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  adlock..  */.  i
155f0 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75  f( sqlite3OsInMu
15600 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65  tex(0) ){.    re
15610 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
15620 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70  * Outermost loop
15630 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73   runs for at mos
15640 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73  t two iterations
15650 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f  . First iteratio
15660 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f  n we.  ** try to
15670 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61   find memory tha
15680 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
15690 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  d without callin
156a0 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e  g fsync(). Secon
156b0 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e  d.  ** iteration
156c0 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e   (which only run
156d0 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66  s if the first f
156e0 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52  ailed to free nR
156f0 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a  eq bytes of.  **
15700 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d   memory) is perm
15710 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73  itted to call fs
15720 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f  ync(). This is o
15730 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f  f course much mo
15740 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69  re .  ** expensi
15750 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
15760 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a  =0; i<=1; i++){.
15770 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
15780 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c  ough all the SQL
15790 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65  ite pagers opene
157a0 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
157b0 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20   thread. */.    
157c0 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50  for(p=pTsdro->pP
157d0 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65 71  ager; p && (nReq
157e0 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c  <0 || nReleased<
157f0 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  nReq); p=p->pNex
15800 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20  t){.      PgHdr 
15810 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pPg;.      int 
15820 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f  rc;..      /* Fo
15830 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72  r each pager, tr
15840 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e  y to free as man
15850 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69  y pages as possi
15860 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20  ble (without .  
15870 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66      ** calling f
15880 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69  sync() if this i
15890 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  s the first iter
158a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74  ation of the out
158b0 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a  ermost .      **
158c0 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f   loop)..      */
158d0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51  .      while( SQ
158e0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70  LITE_OK==(rc = p
158f0 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c 20  ager_recycle(p, 
15900 69 2c 20 26 70 50 67 29 29 20 26 26 20 70 50 67  i, &pPg)) && pPg
15910 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  ) {.        /* W
15920 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67  e've found a pag
15930 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68  e to free. At th
15940 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67  is point the pag
15950 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20  e has been .    
15960 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66      ** removed f
15970 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73  rom the page has
15980 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69  h-table, free-li
15990 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69  st and synced-li
159a0 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  st .        ** (
159b0 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49  pFirstSynced). I
159c0 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68  t is still in th
159d0 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c  e all pages (pAl
159e0 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  l) list. .      
159f0 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66    ** Remove it f
15a00 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65  rom this list be
15a10 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20  fore freeing..  
15a20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
15a30 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20   ** Todo: Check 
15a40 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20  the Pager.pStmt 
15a50 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  list to make sur
15a60 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74  e this is Ok. It
15a70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f   .        ** pro
15a80 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e  bably is though.
15a90 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
15aa0 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b      PgHdr *pTmp;
15ab0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15ac0 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20   pPg );.        
15ad0 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
15ae0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
15af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
15b00 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20  ==p->pAll ){.   
15b10 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20          p->pAll 
15b20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
15b30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15b40 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 70            for( p
15b50 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d  Tmp=p->pAll; pTm
15b60 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67  p->pNextAll!=pPg
15b70 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
15b80 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20  xtAll ){}.      
15b90 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41      pTmp->pNextA
15ba0 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  ll = pPg->pNextA
15bb0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
15bc0 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
15bd0 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69  += sqliteAllocSi
15be0 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ze(pPg);.       
15bf0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
15c00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15c10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15c20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
15c30 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   An error occure
15c40 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
15c50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15c60 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20   file or .      
15c70 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20    ** journal in 
15c80 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e  pager_recycle().
15c90 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f   The error is no
15ca0 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  t returned to th
15cb0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  e .        ** ca
15cc0 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e  ller of this fun
15cd0 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20  ction. Instead, 
15ce0 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72  set the Pager.er
15cf0 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
15d00 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65          ** The e
15d10 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
15d20 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65  urned to the use
15d30 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20  r (or users, in 
15d40 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20  the case .      
15d50 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64    ** of a shared
15d60 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66   pager cache) of
15d70 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77   the pager for w
15d80 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f  hich the error o
15d90 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20  ccured..        
15da0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
15db0 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  t( (rc&0xff)==SQ
15dc0 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63  LITE_IOERR || rc
15dd0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  ==SQLITE_FULL );
15de0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15df0 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
15e00 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
15e10 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
15e20 28 70 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  (p, rc);.      }
15e30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
15e40 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a  turn nReleased;.
15e50 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15e60 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
15e70 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a  _MANAGEMENT */..
15e80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15e90 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
15ea0 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
15eb0 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
15ec0 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
15ed0 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
15ee0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
15ef0 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
15f00 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
15f10 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
15f20 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
15f30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
15f40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
15f50 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
15f60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
15f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15f80 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
15f90 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
15fa0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21  OCK ){.    if( !
15fb0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
15fc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
15fd0 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
15fe0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
15ff0 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
16000 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
16010 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
16020 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
16030 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16050 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
16060 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
16070 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
16080 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
16090 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
160a0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
160b0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
160c0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
160d0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
160e0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
160f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
16100 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
16110 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16120 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
16130 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
16140 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
16150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16160 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
16170 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
16180 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
16190 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
161a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
161b0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
161c0 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
161d0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
161e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
161f0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
16200 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
16210 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
16220 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
16230 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
16240 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
16250 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
16260 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
16270 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
16280 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
16290 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
162a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
162b0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
162c0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
162d0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
162e0 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
162f0 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
16300 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
16310 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
16320 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
16330 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
16340 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
16350 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
16360 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
16370 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
16380 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
16390 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
163a0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
163b0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
163c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
163d0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
163e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
163f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
16400 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
16410 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16420 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16440 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
16450 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
16460 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
16470 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16480 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
16490 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
164a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
164b0 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
164c0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
164d0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
164e0 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
164f0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
16500 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
16510 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
16520 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
16530 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
16540 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
16550 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
16560 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
16570 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
16580 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
16590 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
165a0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
165b0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
165c0 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
165d0 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
165e0 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
165f0 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
16600 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
16610 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
16620 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
16630 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
16640 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
16650 20 20 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20      **..** Open 
16660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
16670 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
16680 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
16690 73 65 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75  se in ..** exclu
166a0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
166b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
166c0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
166d0 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
166e0 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
166f0 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
16700 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
16710 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
16720 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16730 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
16740 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
16750 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
16760 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
16770 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
16780 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
16790 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
167a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
167b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
167c0 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
167d0 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
167e0 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
167f0 20 20 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20         int ro;. 
16800 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
16810 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
16820 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rite(pPager->zJo
16830 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
16840 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20  jfd, &ro);.     
16850 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b 0a 20       if( ro ){. 
16860 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
16870 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16890 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
168a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
168b0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
168c0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
168d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
168e0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
168f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16900 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16910 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
16920 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16930 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
16940 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
16950 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
16960 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
16970 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
16980 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16990 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
169a0 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
169b0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
169c0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
169d0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
169e0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  te.        ** lo
169f0 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
16a00 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
16a10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16a20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
16a30 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
16a40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16a60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16a70 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
16a80 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
16a90 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
16aa0 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  rt(pPager->state
16ab0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  ==PAGER_SHARED |
16ac0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
16ad0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
16ae0 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
16af0 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
16b00 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  RED).        );.
16b10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
16b20 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  f( pPager->pAll 
16b30 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
16b40 20 2a 70 50 61 67 65 31 20 3d 20 70 61 67 65 72   *pPage1 = pager
16b50 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16b60 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16b70 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 20 20  pPage1 ){.      
16b80 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
16b90 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ain(pPager, pPag
16ba0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e1);.        }..
16bb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16bc0 21 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50  !pager_lookup(pP
16bd0 61 67 65 72 2c 20 31 29 20 29 3b 0a 20 20 20 20  ager, 1) );.    
16be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16bf0 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61  PagerAcquire(pPa
16c00 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  ger, 1, &pPage1,
16c10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16c30 7b 0a 09 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  {..  /* The chan
16c40 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 73 74  ge-counter is st
16c50 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74 20 32  ored at offset 2
16c60 34 2e 20 53 65 65 20 61 6c 73 6f 0a 20 20 20 20  4. See also.    
16c70 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69        ** pager_i
16c80 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
16c90 72 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  r()..          *
16ca0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  /.          u32 
16cb0 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72  iChangeCount = r
16cc0 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
16cd0 61 67 65 31 2c 20 32 34 29 3b 0a 20 20 20 20 20  age1, 24);.     
16ce0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
16cf0 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f++;.          s
16d00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
16d10 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
16d20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
16d30 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  --;.          if
16d40 28 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d  ( iChangeCount!=
16d50 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43  pPager->iChangeC
16d60 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
16d70 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
16d80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
16da0 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
16db0 75 6e 74 20 3d 20 69 43 68 61 6e 67 65 43 6f 75  unt = iChangeCou
16dc0 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
16dd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16de0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16df0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
16e00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
16e10 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
16e20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16e30 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
16e40 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
16e50 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
16e60 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
16e70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
16e80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
16e90 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
16ea0 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
16eb0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
16ec0 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
16ed0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
16ee0 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
16ef0 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
16f00 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
16f10 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
16f20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
16f30 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
16f40 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
16f50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
16f60 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
16f70 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
16f80 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
16f90 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
16fa0 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
16fb0 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
16fc0 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
16fd0 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
16fe0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
16ff0 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
17000 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
17010 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
17020 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
17030 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
17040 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
17050 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
17060 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
17070 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
17080 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
17090 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
170a0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
170b0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
170c0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
170d0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
170e0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
170f0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
17100 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
17110 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
17120 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
17130 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
17140 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
17150 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
17160 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
17170 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
17180 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
17190 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
171a0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
171b0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
171c0 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
171d0 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
171e0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
171f0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
17200 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
17210 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
17220 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
17230 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
17240 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
17250 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
17260 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
17270 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
17280 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
17290 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
172a0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
172b0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
172c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
172d0 2a 0a 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67 20  *.** If clrFlag 
172e0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61  is false, the pa
172f0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17300 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
17310 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63  om disk..** If c
17320 6c 66 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  lfFlag is true, 
17330 69 74 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  it means the pag
17340 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
17350 20 65 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72   erased and.** r
17360 65 77 72 69 74 74 65 6e 20 77 69 74 68 6f 75 74  ewritten without
17370 20 66 69 72 73 74 20 62 65 69 6e 67 20 72 65 61   first being rea
17380 64 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  d so there is no
17390 20 70 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a   point it doing.
173a0 2a 2a 20 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e  ** the disk I/O.
173b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
173c0 61 67 65 72 41 63 71 75 69 72 65 28 50 61 67 65  agerAcquire(Page
173d0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
173e0 70 67 6e 6f 2c 20 44 62 50 61 67 65 20 2a 2a 70  pgno, DbPage **p
173f0 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c  pPage, int clrFl
17400 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
17410 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
17420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17430 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17440 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
17450 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
17460 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
17470 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
17480 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
17490 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
174a0 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
174b0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
174c0 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
174d0 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
174e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
174f0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
17500 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
17510 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
17520 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
17530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17540 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
17550 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
17560 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
17570 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
17580 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
17590 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
175a0 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
175b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
175c0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
175d0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
175e0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
175f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
17600 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
17610 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
17620 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
17630 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
17640 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
17650 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17660 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72   file. pagerShar
17670 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  edLock() is a no
17680 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64  -op if .  ** a d
17690 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20  atabase lock is 
176a0 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20  already held..  
176b0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  */.  rc = pagerS
176c0 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  haredLock(pPager
176d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
176e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
176f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
17700 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17710 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
17720 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70  CK );..  pPg = p
17730 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
17740 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
17750 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
17760 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
17770 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
17780 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
17790 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
177a0 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54      int h;.    T
177b0 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
177c0 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28  >nMiss);.    if(
177d0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
177e0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
177f0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
17800 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20  =0 || MEMDB ||. 
17810 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
17820 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
17830 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  && pPager->doNot
17840 53 79 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20 20  Sync).    ){.   
17850 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
17860 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
17870 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
17880 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73  ge>=pPager->nHas
17890 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  h ){.        pag
178a0 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
178b0 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20  able(pPager,.   
178c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
178d0 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20  nHash<256 ? 256 
178e0 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a  : pPager->nHash*
178f0 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
17900 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30  pPager->nHash==0
17910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
17930 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
17940 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d     }.      pPg =
17950 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
17960 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
17970 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17980 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
179b0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d               + M
179e0 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
179f0 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20  story) );.      
17a00 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
17a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17a20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17a30 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
17a40 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
17a50 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28  pPg));.      if(
17a60 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
17a70 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
17a80 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
17a90 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
17aa0 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
17ab0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
17ac0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
17ad0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
17ae0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
17af0 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ll;.      pPager
17b00 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
17b10 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
17b20 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
17b30 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61  Pager->nPage>pPa
17b40 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b  ger->nMaxPage ){
17b50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17b60 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
17b70 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67  e==(pPager->nPag
17b80 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  e-1) );.        
17b90 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
17ba0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
17bb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
17bc0 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
17bd0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29  pPager, 1, &pPg)
17be0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
17bf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17c00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
17c20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
17c30 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
17c40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17c50 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
17c60 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
17c70 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
17c80 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
17c90 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
17ca0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
17cb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
17cc0 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
17cd0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
17ce0 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73  gno/8);.      as
17cf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
17d00 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
17d10 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
17d20 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
17d30 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
17d40 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
17d50 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  !=0;.      pPg->
17d60 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
17d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17d80 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
17d90 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
17da0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
17db0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
17dc0 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e  ->aInStmt && (in
17dd0 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
17de0 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20  stmtSize.       
17df0 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72        && (pPager
17e00 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38  ->aInStmt[pgno/8
17e10 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
17e20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
17e30 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
17e40 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
17e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65  else{.      page
17e60 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
17e70 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
17e80 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e   }.    makeClean
17e90 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
17ea0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45  nRef = 1;.    RE
17eb0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20  FINFO(pPg);..   
17ec0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
17ed0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17ee0 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
17ef0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
17f00 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
17f10 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
17f20 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
17f30 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69  .    nMax = sqli
17f40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17f50 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
17f60 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17f70 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
17f80 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
17f90 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  g);.      rc = p
17fa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
17fb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17fc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
17fd0 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65  opulate the page
17fe0 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68   with data, eith
17ff0 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72  er by reading fr
18000 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
18010 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20      ** file, or 
18020 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  by setting the e
18030 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65  ntire page to ze
18040 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ro..    */.    i
18050 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e  f( nMax<(int)pgn
18060 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 63  o || MEMDB || (c
18070 6c 72 46 6c 61 67 20 26 26 20 21 70 50 61 67 65  lrFlag && !pPage
18080 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
18090 6b 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  k) ){.      mems
180a0 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
180b0 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
180c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
180d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
180e0 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
180f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18100 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
18110 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
18120 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
18130 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
18140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18150 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18160 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
18170 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
18180 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20  TO_DATA(pPg),.  
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
181b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
181c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
181d0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
181e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
181f0 6e 6f 29 29 0a 20 20 20 20 20 20 50 41 47 45 52  no)).      PAGER
18200 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64  TRACE3("FETCH %d
18210 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
18220 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
18230 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
18240 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
18250 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
18260 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
18270 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18280 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
18290 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
182a0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
182b0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
182c0 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
182d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
182e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
182f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n rc;.      }els
18300 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f  e{.        TEST_
18310 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
18320 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ad);.      }.   
18330 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
18340 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
18350 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
18360 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
18370 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
18380 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72  sh-1);.    asser
18390 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
183a0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
183b0 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
183c0 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
183d0 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
183e0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
183f0 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
18400 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
18410 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
18420 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
18430 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
18440 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
18450 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
18460 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
18470 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
18480 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
18490 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
184a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
184b0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
184c0 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
184d0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
184e0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
184f0 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
18500 31 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43  1);.    TEST_INC
18510 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
18520 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
18530 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
18540 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72  e = pPg;.  retur
18550 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18560 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
18570 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
18580 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
18590 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
185a0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
185b0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
185c0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
185d0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
185e0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
185f0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
18600 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
18610 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
18620 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
18630 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18640 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
18650 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
18660 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
18670 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
18680 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
18690 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
186a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
186b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
186c0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
186d0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
186e0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
186f0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
18700 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
18710 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
18720 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
18730 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
18740 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
18750 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
18760 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
18770 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
18780 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
18790 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
187a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
187b0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
187c0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
187d0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c  rt( !pPager->pAl
187e0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63  l || pPager->exc
187f0 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20  lusiveMode );.  
18800 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18810 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18820 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
18830 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
18840 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
18850 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  urn 0;.  }.  pPg
18860 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
18870 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
18880 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
18890 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
188a0 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
188b0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
188c0 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
188d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
188e0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
188f0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
18900 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
18910 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
18920 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
18930 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
18940 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
18950 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
18960 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
18970 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
18980 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
18990 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
189a0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
189b0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
189c0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a  (DbPage *pPg){..
189d0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
189e0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
189f0 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
18a00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18a10 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
18a20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
18a30 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
18a40 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
18a50 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
18a60 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
18a70 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
18a80 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
18a90 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
18aa0 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
18ab0 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
18ac0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
18ad0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
18ae0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
18af0 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
18b00 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
18b10 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
18b20 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
18b30 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
18b40 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
18b50 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
18b60 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
18b70 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
18b80 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
18b90 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
18ba0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18bb0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
18bc0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
18bd0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
18be0 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
18bf0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
18c00 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
18c10 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
18c20 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
18c30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
18c40 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
18c50 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
18c60 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67  ructor(pPg, pPag
18c70 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18c80 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
18c90 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
18ca0 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
18cb0 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
18cc0 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
18cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18ce0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
18cf0 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
18d00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18d10 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
18d20 20 20 2f 2f 20 61 73 73 65 72 74 28 20 70 50 61    // assert( pPa
18d30 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 21  ger->nRef>0 || !
18d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18d50 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
18d60 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 3b 0a  ournalOff==0 );.
18d70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18d80 6e 52 65 66 3d 3d 30 20 26 26 20 21 70 50 61 67  nRef==0 && !pPag
18d90 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
18da0 65 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  e ){.      pager
18db0 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
18dc0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
18dd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
18de0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18df0 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e  * Create a journ
18e00 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67  al file for pPag
18e10 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c  er.  There shoul
18e20 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  d already be a R
18e30 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58  ESERVED.** or EX
18e40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
18e50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18e60 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
18e70 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
18e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18e90 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
18ea0 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ing.  Return an 
18eb0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72  error code and r
18ec0 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72  elease the.** wr
18ed0 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74  ite lock if anyt
18ee0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
18ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18f00 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
18f10 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
18f20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
18f30 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
18f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18f50 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
18f60 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
18f70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
18f80 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
18f90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18fa0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
18fb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18fc0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
18fd0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
18fe0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
18ff0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
19000 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
19010 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
19020 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
19030 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
19040 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
19050 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19060 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66  OMEM;.    goto f
19070 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
19080 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20  urnal;.  }.  rc 
19090 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
190a0 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d  xclusive(pPager-
190b0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67  >zJournal, &pPag
190c0 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20  er->jfd,.       
190d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190e0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
190f0 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  ->tempFile);.  p
19100 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
19110 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
19120 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
19130 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
19140 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
19150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19160 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
19170 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
19180 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
19190 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61  sSetFullSync(pPa
191a0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
191b0 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
191c0 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
191d0 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  lSync(pPager->fd
191e0 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
191f0 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
19200 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
19210 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
19220 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
19230 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
19240 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
19250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
19260 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
19270 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
19280 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
19290 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
192a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
192b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
192c0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
192d0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
192e0 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f  rrCode;.    goto
192f0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
19300 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70  journal;.  }.  p
19310 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
19320 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
19330 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  ze;..  rc = writ
19340 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
19350 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  er);..  if( pPag
19360 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
19370 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
19380 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
19390 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
193a0 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
193b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
193c0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
193d0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
193e0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
193f0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
19400 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19420 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
19430 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19440 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
19450 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
19460 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
19470 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19480 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
19490 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69  Journal = 0;.  i
194a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
194b0 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  MEM ){.    /* If
194c0 20 74 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c   this was a mall
194d0 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68  oc() failure, th
194e0 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62  en we will not b
194f0 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  e closing the pa
19500 67 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ger.    ** file.
19510 20 53 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a   So delete any j
19520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d  ournal file we m
19530 61 79 20 68 61 76 65 20 6a 75 73 74 20 63 72 65  ay have just cre
19540 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
19550 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74  .    ** the syst
19560 65 6d 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66  em will get conf
19570 75 73 65 64 2c 20 77 65 20 68 61 76 65 20 61 20  used, we have a 
19580 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
19590 20 66 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20   file and a.    
195a0 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f  ** mysterious jo
195b0 75 72 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72  urnal has appear
195c0 65 64 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ed in the filesy
195d0 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  stem..    */.   
195e0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 44 65 6c   /* sqlite3OsDel
195f0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
19600 72 6e 61 6c 29 3b 20 2a 2f 0a 20 20 7d 65 6c 73  rnal); */.  }els
19610 65 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  e{.    pager_res
19620 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
19630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19640 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
19650 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
19660 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
19670 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
19680 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
19690 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
196a0 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
196b0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
196c0 72 43 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c  rCommit() is cal
196d0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
196e0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
196f0 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
19700 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
19710 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61  gerClose() is ca
19720 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
19730 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19740 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
19750 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
19760 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
19770 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
19780 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
19790 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
197a0 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
197b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
197c0 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
197d0 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
197e0 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
197f0 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
19800 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
19810 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
19820 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
19830 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
19840 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
19850 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
19860 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
19870 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
19880 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
19890 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
198a0 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
198b0 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
198c0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
198d0 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
198e0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
198f0 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
19900 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
19910 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
19920 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
19930 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
19940 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
19950 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
19960 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
19970 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
19980 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
19990 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
199a0 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
199b0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
199c0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
199d0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
199e0 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
199f0 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
19a00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19a10 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
19a20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
19a30 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
19a40 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
19a50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
19a60 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
19a70 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
19a80 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
19a90 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
19aa0 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
19ab0 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
19ac0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
19ad0 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
19ae0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
19af0 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61  3PagerBegin(DbPa
19b00 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46  ge *pPg, int exF
19b10 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  lag){.  Pager *p
19b20 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
19b30 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
19b40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
19b50 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
19b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19b70 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
19b80 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
19b90 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
19ba0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
19bb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
19bc0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19bd0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d  ==0 );.    if( M
19be0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
19bf0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
19c00 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
19c10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
19c20 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
19c30 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
19c40 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
19c50 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
19c60 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
19c70 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
19c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19c90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
19ca0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
19cb0 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
19cc0 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
19cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
19ce0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
19cf0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
19d00 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
19d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19d20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19d30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19d40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19d50 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
19d60 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
19d70 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54   0;.      PAGERT
19d80 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
19d90 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
19da0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
19db0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
19dc0 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
19dd0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
19de0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
19df0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
19e00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
19e10 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
19e20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
19e30 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
19e40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
19e50 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
19e60 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
19e70 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
19e80 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
19e90 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20  ode last.    ** 
19ea0 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20  time a (read or 
19eb0 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
19ec0 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
19ed0 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20  lly concluded.  
19ee0 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e    ** by this con
19ef0 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  nection. Instead
19f00 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   of deleting the
19f10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
19f20 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70   was .    ** kep
19f30 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63  t open and trunc
19f40 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e  ated to 0 bytes.
19f50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
19f60 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
19f70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
19f80 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  t( pPager->origD
19f90 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  bSize==0 );.    
19fa0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19fb0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
19fc0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
19fd0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
19fe0 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  dbSize;.    pPag
19ff0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1a000 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1a010 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1a020 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  + 1 );.    if( !
1a030 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a040 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
1a050 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a070 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1a080 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1a090 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
1a0a0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1a0b0 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72  alOpen || pPager
1a0c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c  ->journalOff>0 |
1a0d0 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
1a0e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a0f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
1a100 70 61 67 65 20 64 69 72 74 79 2e 20 20 53 65 74  page dirty.  Set
1a110 20 69 74 73 20 64 69 72 74 79 20 66 6c 61 67 20   its dirty flag 
1a120 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74 68  and add it to th
1a130 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20  e dirty.** page 
1a140 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1a150 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50  void makeDirty(P
1a160 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
1a170 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
1a180 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
1a190 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1a1a0 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72  er;.    pPg->dir
1a1b0 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d  ty = 1;.    pPg-
1a1c0 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72  >pDirty = pPager
1a1d0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66  ->pDirty;.    if
1a1e0 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ( pPager->pDirty
1a1f0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1a200 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
1a210 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20  irty = pPg;.    
1a220 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  }.    pPg->pPrev
1a230 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
1a240 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1a250 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pPg;.  }.}../*.*
1a260 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c  * Make a page cl
1a270 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20  ean.  Clear its 
1a280 64 69 72 74 79 20 62 69 74 20 61 6e 64 20 72 65  dirty bit and re
1a290 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
1a2a0 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c  .** dirty page l
1a2b0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
1a2c0 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
1a2d0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
1a2e0 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
1a2f0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1a300 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  0;.    if( pPg->
1a310 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
1a320 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  pPg->pDirty->pPr
1a330 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  evDirty = pPg->p
1a340 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d  PrevDirty;.    }
1a350 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
1a360 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20  revDirty ){.    
1a370 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
1a380 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  y->pDirty = pPg-
1a390 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
1a3a0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
1a3b0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1a3c0 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
1a3d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
1a3e0 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
1a3f0 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
1a400 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
1a410 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
1a420 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
1a430 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
1a440 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
1a450 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
1a460 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
1a470 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
1a480 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
1a490 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
1a4a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a4b0 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
1a4c0 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
1a4d0 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
1a4e0 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
1a4f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a500 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
1a510 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
1a520 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
1a530 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
1a540 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
1a550 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
1a560 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
1a570 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
1a580 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
1a590 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
1a5a0 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
1a5b0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
1a5c0 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
1a5d0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1a5e0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
1a5f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
1a600 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
1a610 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
1a620 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
1a630 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1a640 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
1a650 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
1a660 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
1a670 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
1a680 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
1a690 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
1a6a0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
1a6b0 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
1a6c0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1a6d0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20  e3PagerCommit() 
1a6e0 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  or sqlite3PagerR
1a6f0 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
1a700 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  reset..*/.static
1a710 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
1a720 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1a730 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47  void *pData = PG
1a740 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1a750 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1a760 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1a770 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1a780 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
1a790 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
1a7a0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1a7b0 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20  >errCode ){ .   
1a7c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1a7d0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
1a7e0 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
1a7f0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
1a800 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
1a810 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
1a820 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1a830 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
1a840 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61  E(pPg);..  /* Ma
1a850 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
1a860 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
1a870 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
1a880 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
1a890 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1a8a0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
1a8b0 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
1a8c0 20 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28   */.  makeDirty(
1a8d0 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d  pPg);.  if( pPg-
1a8e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
1a8f0 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50  Pg->inStmt || pP
1a900 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
1a910 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
1a920 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1a930 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
1a940 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
1a950 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
1a960 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
1a970 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
1a980 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
1a990 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1a9a0 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
1a9b0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
1a9c0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
1a9d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
1a9e0 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
1a9f0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1aa00 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
1aa10 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
1aa20 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
1aa30 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
1aa40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1aa50 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1aa60 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
1aa70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1aa80 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20  Begin(pPg, 0);. 
1aa90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aaa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1aab0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1aac0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1aad0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1aae0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
1aaf0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1ab00 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1ab10 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1ab20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1ab30 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1ab40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1ab50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ab60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1ab70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1ab80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ab90 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
1aba0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
1abb0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1abc0 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
1abd0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1abe0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
1abf0 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
1ac00 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
1ac10 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
1ac20 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1ac30 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1ac40 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
1ac50 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
1ac60 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
1ac70 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
1ac80 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
1ac90 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
1aca0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
1acb0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
1acc0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1acd0 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
1ace0 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
1acf0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1ad00 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1ad10 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
1ad20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  ;.        if( ME
1ad30 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
1ad40 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1ad50 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1ad60 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1ad70 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
1ad80 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
1ad90 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1ada0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1adb0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1adc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
1add0 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
1ade0 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
1adf0 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d  >pOrig = sqliteM
1ae00 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
1ae10 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1ae20 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1ae30 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
1ae40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1ae50 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
1ae60 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1ae70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ae80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1ae90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1aea0 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
1aeb0 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20  um, saved;.     
1aec0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1aed0 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  2, *pEnd;.      
1aee0 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
1aef0 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
1af00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1af10 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
1af20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
1af30 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
1af40 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
1af50 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
1af60 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
1af70 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
1af80 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
1af90 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1afa0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
1afb0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
1afc0 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d          pData2 =
1afd0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1afe0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1aff0 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
1b000 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
1b010 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
1b020 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
1b030 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61      pEnd = pData
1b040 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  2 + pPager->page
1b050 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
1b060 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20  pData2 -= 4;.   
1b070 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
1b080 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20  (u32*)pEnd;.    
1b090 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1b0a0 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  pEnd, cksum);.  
1b0b0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
1b0c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
1b0d0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  8;.          put
1b0e0 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70  32bits(pData2, p
1b0f0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1b100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b110 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1b120 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a  >jfd, pData2, sz
1b130 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  Pg);.          I
1b140 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
1b150 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
1b160 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1b170 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1b180 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b190 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29  urnalOff, szPg))
1b1a0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1b1b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
1b1c0 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20   szPg;.         
1b1d0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 4a 4f   PAGERTRACE4("JO
1b1e0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1b1f0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1b200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b210 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1b220 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1b230 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1b240 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
1b250 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09  pEnd = saved;...
1b260 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1b270 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1b280 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1b290 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1b2a0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1b2b0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
1b2c0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
1b2d0 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
1b2e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1b2f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b310 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b320 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1b330 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1b340 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
1b350 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b360 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1b370 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1b380 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1b390 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1b3a0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1b3b0 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1b3c0 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1b3d0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1b3e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1b3f0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1b400 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1b410 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1b420 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1b430 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1b440 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64           page_ad
1b450 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1b460 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Pg);.          }
1b470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b490 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1b4a0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1b4b0 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
1b4c0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1b4d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
1b4e0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1b4f0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1b500 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b510 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1b520 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1b530 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1b540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b550 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
1b560 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1b570 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1b580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1b590 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1b5a0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1b5b0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
1b5c0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
1b5d0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
1b5e0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
1b5f0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
1b600 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1b610 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
1b620 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
1b630 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
1b640 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1b650 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
1b660 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
1b670 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
1b680 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
1b690 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
1b6a0 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
1b6b0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
1b6c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1b6d0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
1b6e0 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
1b6f0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1b700 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
1b710 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b720 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1b730 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1b740 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1b750 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1b760 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1b770 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1b780 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1b790 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1b7a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b7b0 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
1b7c0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1b7d0 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
1b7e0 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
1b7f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1b800 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1b810 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1b820 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
1b830 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
1b840 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1b850 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1b860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b870 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1b880 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1b890 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1b8a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1b8b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
1b8c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
1b8d0 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44  ar *pData2 = COD
1b8e0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1b8f0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
1b900 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  -4;.        put3
1b910 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50  2bits(pData2, pP
1b920 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1b930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b940 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74  Write(pPager->st
1b950 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
1b960 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b  er->pageSize+4);
1b970 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1b980 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
1b990 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1b9a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b9b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1b9c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b9d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b9e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b9f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba00 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
1ba10 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
1ba20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1ba30 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1ba40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1ba50 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1ba60 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1ba70 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20  no&7);.      }. 
1ba80 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
1ba90 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
1baa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1bab0 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
1bac0 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
1bad0 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  turn..  */.  ass
1bae0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1baf0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1bb00 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1bb10 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
1bb20 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
1bb30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1bb40 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
1bb50 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
1bb60 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
1bb70 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
1bb80 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
1bb90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1bba0 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
1bbb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bbc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1bbd0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ion is used to m
1bbe0 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20  ark a data-page 
1bbf0 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20  as writable. It 
1bc00 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77  uses .** pager_w
1bc10 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61  rite() to open a
1bc20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
1bc30 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1bc40 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64  ady open).** and
1bc50 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20   write the page 
1bc60 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f  *pData to the jo
1bc70 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
1bc80 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1bc90 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
1bca0 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74  n and pager_writ
1bcb0 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73  e() is that this
1bcc0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73  .** function als
1bcd0 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65  o deals with the
1bce0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
1bcf0 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61  ere 2 or more pa
1bd00 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20  ges.** fit on a 
1bd10 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
1bd20 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
1bd30 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74   all co-resident
1bd40 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68   pages.** must h
1bd50 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1bd60 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1bd70 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75  file before retu
1bd80 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
1bd90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bda0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
1bdb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1bdc0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72  ITE_OK;..  PgHdr
1bdd0 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
1bde0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1bdf0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1be00 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53    Pgno nPagePerS
1be10 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d  ector = (pPager-
1be20 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67  >sectorSize/pPag
1be30 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
1be40 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
1be50 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
1be60 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
1be70 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
1be80 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1be90 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1bea0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1beb0 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bed0 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
1bee0 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
1bef0 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
1bf00 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1bf30 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
1bf40 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1bf50 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f    int ii;..    /
1bf60 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
1bf70 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
1bf80 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
1bf90 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
1bfa0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1bfb0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
1bfc0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
1bfd0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
1bfe0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1bff0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
1c000 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
1c010 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
1c020 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
1c030 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
1c040 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
1c050 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
1c060 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
1c070 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
1c080 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
1c090 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
1c0a0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
1c0b0 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
1c0c0 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
1c0d0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1c0e0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
1c0f0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
1c100 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
1c110 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
1c120 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
1c130 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
1c140 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c  nPageCount = sql
1c150 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c160 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
1c170 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
1c180 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
1c190 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
1c1a0 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
1c1b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
1c1c0 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
1c1d0 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
1c1e0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1c1f0 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
1c200 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c210 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
1c220 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
1c230 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
1c240 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
1c250 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
1c260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
1c270 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
1c280 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
1c290 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
1c2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1c2b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
1c2c0 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
1c2d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1c2e0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70  >aInJournal || p
1c2f0 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
1c300 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e 70 50  .          pg>pP
1c310 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1c320 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61 49   || !(pPager->aI
1c330 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28  nJournal[pg/8]&(
1c340 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20 20  1<<(pg&7))).    
1c350 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66    ) {.        if
1c360 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
1c370 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
1c380 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a           PgHdr *
1c390 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  pPage;.         
1c3a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c3b0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
1c3c0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
1c3d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c3e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c3f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c400 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
1c410 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1c420 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
1c430 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
1c440 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c450 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
1c460 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
1c470 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20  NotSync==1 );.  
1c480 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
1c490 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
1c4a0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1c4b0 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  _write(pDbPage);
1c4c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c4d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c4e0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
1c4f0 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
1c500 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
1c510 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
1c520 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
1c530 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
1c540 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
1c550 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
1c560 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
1c570 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
1c580 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
1c590 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
1c5a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1c5b0 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
1c5c0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
1c5d0 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64  g->dirty;.}.#end
1c5e0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1c5f0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
1c600 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
1c610 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
1c620 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
1c630 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1c640 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
1c650 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
1c660 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72  sqlite3PagerOver
1c670 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
1c680 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
1c690 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
1c6a0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
1c6b0 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  t rc;..  rc = sq
1c6c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1c6d0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67  ager, pgno, &pPg
1c6e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c6f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c700 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1c710 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69  rite(pPg);.    i
1c720 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c730 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1c740 28 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  (sqlite3PagerGet
1c750 44 61 74 61 28 70 50 67 29 2c 20 70 44 61 74 61  Data(pPg), pData
1c760 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1c770 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
1c780 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1c790 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
1c7a0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1c7b0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
1c7c0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
1c7d0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
1c7e0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
1c7f0 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
1c800 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
1c810 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
1c820 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
1c830 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
1c840 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
1c850 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
1c860 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
1c870 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
1c880 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
1c890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
1c8a0 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
1c8b0 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
1c8c0 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
1c8d0 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
1c8e0 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
1c8f0 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
1c900 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
1c910 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
1c920 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
1c930 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
1c940 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
1c950 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
1c960 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1c970 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77  Rollback() below
1c980 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62  , more than doub
1c990 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20  le the speed.** 
1c9a0 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20  of large INSERT 
1c9b0 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71  operations and q
1c9c0 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
1c9d0 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45  ed of large DELE
1c9e0 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  TEs..**.** When 
1c9f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ca00 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20  called, set the 
1ca10 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1ca20 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20  lag to true..** 
1ca30 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
1ca40 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1ca50 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66  DontRollback() f
1ca60 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
1ca70 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
1ca80 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
1ca90 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1caa0 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
1cab0 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
1cac0 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
1cad0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1cae0 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
1caf0 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
1cb00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1cb10 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
1cb20 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1cb30 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
1cb40 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
1cb50 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
1cb60 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
1cb70 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
1cb80 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
1cb90 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
1cba0 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
1cbb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1cbc0 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
1cbd0 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
1cbe0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
1cbf0 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
1cc00 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
1cc10 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
1cc20 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
1cc30 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
1cc40 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
1cc50 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1cc60 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
1cc70 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
1cc80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cc90 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50  PagerDontWrite(P
1cca0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1ccb0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
1ccc0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d  r *pPg;..  if( M
1ccd0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a  EMDB ) return;..
1cce0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
1ccf0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1cd00 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
1cd10 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e  g!=0 );  /* We n
1cd20 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f  ever call _dont_
1cd30 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65  write unless the
1cd40 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20   page is in mem 
1cd50 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  */.  pPg->always
1cd60 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1cd70 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
1cd80 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
1cd90 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65  nUse ){.    asse
1cda0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1cdb0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1cdc0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1cdd0 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
1cde0 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
1cdf0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
1ce00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
1ce10 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1ce20 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
1ce30 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
1ce40 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
1ce50 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
1ce60 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
1ce70 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1ce80 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
1ce90 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
1cea0 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
1ceb0 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
1cec0 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
1ced0 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
1cee0 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
1cef0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
1cf00 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
1cf10 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
1cf20 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
1cf30 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
1cf40 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
1cf50 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
1cf60 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
1cf70 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
1cf80 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
1cf90 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
1cfa0 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
1cfb0 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
1cfc0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
1cfd0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
1cfe0 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
1cff0 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
1d000 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1d010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
1d020 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57  ERTRACE3("DONT_W
1d030 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
1d040 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47  %d\n", pgno, PAG
1d050 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1d060 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
1d070 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
1d080 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20  Pager, pgno)).  
1d090 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
1d0a0 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  g);.#ifdef SQLIT
1d0b0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1d0c0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1d0d0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1d0e0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1d0f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1d100 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1d110 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1d120 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1d130 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
1d140 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
1d150 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
1d160 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
1d170 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1d180 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
1d190 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1d1a0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1d1b0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
1d1c0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
1d1d0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
1d1e0 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
1d1f0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1d200 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67  back(DbPage *pPg
1d210 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1d220 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1d230 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1d240 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1d250 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1d260 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1d270 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
1d280 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
1d290 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1d2a0 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
1d2b0 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44  Rollback || MEMD
1d2c0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  B ) return;.  if
1d2d0 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1d2e0 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
1d2f0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1d300 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
1d310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d320 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1d330 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1d340 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
1d350 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1d360 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
1d370 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1d380 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
1d390 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1d3a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1d3b0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1d3c0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1d3d0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61  gno&7);.      pa
1d3e0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1d3f0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
1d400 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1d410 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
1d420 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1d430 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
1d440 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1d450 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42    IOTRACE(("GARB
1d460 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  AGE %p %d\n", pP
1d470 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1d480 29 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ).  }.  if( pPag
1d490 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
1d4a0 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
1d4b0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1d4c0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1d4d0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1d4e0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1d4f0 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1d500 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1d510 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
1d520 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1d530 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
1d540 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1d550 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1d560 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1d570 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1d580 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1d590 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f    }.}.../*.** Co
1d5a0 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
1d5b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d5c0 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1d5d0 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
1d5e0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
1d5f0 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
1d600 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
1d610 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
1d620 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
1d630 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1d640 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
1d650 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
1d660 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
1d670 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
1d680 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 50  te3PagerCommit(P
1d690 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1d6a0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
1d6b0 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
1d6c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1d6d0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1d6e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1d6f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1d700 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
1d710 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
1d720 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1d730 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45    }.  PAGERTRACE
1d740 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
1d750 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d760 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1d770 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
1d780 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1d790 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1d7a0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
1d7b0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1d7c0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
1d7d0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
1d7e0 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
1d7f0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
1d800 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1d810 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1d820 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1d830 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1d840 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1d850 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1d860 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1d870 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
1d880 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  rty;.    }.    p
1d890 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1d8a0 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  0;.#ifndef NDEBU
1d8b0 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  G.    for(pPg=pP
1d8c0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1d8d0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1d8e0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
1d8f0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1d900 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1d910 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1d920 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
1d930 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1d940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1d950 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
1d960 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
1d970 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
1d980 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
1d990 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1d9a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1d9b0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1d9c0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1d9d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d9e0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  if( pPager->dirt
1d9f0 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20  yCache==0 ){.   
1da00 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28   /* Exit early (
1da10 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68  without doing th
1da20 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67  e time-consuming
1da30 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
1da40 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69   calls).    ** i
1da50 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  f there have bee
1da60 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20  n no changes to 
1da70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1da80 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1da90 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1daa0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  nc==0 );.    rc 
1dab0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1dac0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
1dad0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1dae0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1daf0 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 72 63 20  lOpen );.    rc 
1db00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
1db10 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  nc(pPager, 0, 0)
1db20 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1db30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1db40 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
1db50 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1db60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1db70 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
1db80 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
1db90 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1dba0 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
1dbb0 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
1dbc0 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
1dbd0 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c  ARED mode..** Al
1dbe0 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
1dbf0 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74  e pages revert t
1dc00 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  o their original
1dc10 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a   data contents..
1dc20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** The journal i
1dc30 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
1dc40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1dc50 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73  nnot fail unless
1dc60 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
1dc70 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
1dc80 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72  wing.** the corr
1dc90 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  ect locking prot
1dca0 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f  ocol (SQLITE_PRO
1dcb0 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73  TOCOL) or unless
1dcc0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
1dcd0 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
1dce0 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65  g trash into the
1dcf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53   journal file (S
1dd00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f  QLITE_CORRUPT) o
1dd10 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72  r.** unless a pr
1dd20 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ior malloc() fai
1dd30 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  led (SQLITE_NOME
1dd40 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65  M).  Appropriate
1dd50 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20   error.** codes 
1dd60 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72  are returned for
1dd70 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73   all these occas
1dd80 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65  ions.  Otherwise
1dd90 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1dda0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
1ddb0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
1ddc0 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
1ddd0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1dde0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
1ddf0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
1de00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1de10 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1de20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1de30 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
1de40 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
1de50 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1de60 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1de70 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1de80 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
1de90 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
1dea0 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
1deb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1dec0 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1ded0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1dee0 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
1def0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1df00 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1df10 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1df20 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
1df30 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
1df40 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
1df50 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
1df60 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1df70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1df80 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1df90 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1dfa0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1dfb0 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
1dfc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1dfd0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1dfe0 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
1dff0 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
1e000 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
1e010 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1e020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e030 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1e040 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
1e050 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
1e060 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1e070 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
1e080 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
1e090 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
1e0a0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1e0b0 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
1e0c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
1e0d0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1e0e0 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  p->pPrevStmt = p
1e0f0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1e100 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1e110 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
1e120 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e130 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61  xReiniter(p, pPa
1e140 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1e150 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e160 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1e170 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1e180 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1e190 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1e1a0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
1e1b0 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Size;.    memory
1e1c0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
1e1d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1e1e0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
1e1f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1e200 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
1e210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e220 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
1e230 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
1e240 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
1e250 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1e260 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
1e270 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1e280 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1e290 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1e2a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
1e2b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
1e2c0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
1e2d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e2e0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
1e2f0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
1e300 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
1e310 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
1e320 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1e330 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1e340 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1e350 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
1e360 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
1e370 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
1e380 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1e390 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
1e3a0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
1e3b0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
1e3c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e3d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1e3e0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
1e3f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1e400 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1e410 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1e420 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1e430 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e   -1;..  /* If an
1e440 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
1e450 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
1e460 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
1e470 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
1e480 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f  r.  ** cache. So
1e490 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
1e4a0 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
1e4b0 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
1e4c0 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69  rror .  ** persi
1e4d0 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65  stent..  */.  re
1e4e0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1e4f0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1e500 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
1e510 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
1e520 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
1e530 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
1e540 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
1e550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e560 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
1e570 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
1e580 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
1e590 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
1e5a0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1e5b0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
1e5c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e5d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
1e5e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1e5f0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
1e600 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1e610 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1e620 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1e630 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
1e640 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1e650 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e660 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
1e670 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
1e680 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
1e690 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
1e6a0 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
1e6b0 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
1e6c0 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
1e6d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
1e6e0 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
1e6f0 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
1e700 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
1e710 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
1e720 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
1e730 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
1e740 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
1e750 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
1e760 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
1e770 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
1e780 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
1e790 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c   = pPager->nOvfl
1e7a0 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65  ;.  a[9] = pPage
1e7b0 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30  r->nRead;.  a[10
1e7c0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69  ] = pPager->nWri
1e7d0 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  te;.  return a;.
1e7e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e7f0 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  Set the statemen
1e800 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74  t rollback point
1e810 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1e820 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63  tine should be c
1e830 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  alled with the t
1e840 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1e850 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70  al already.** op
1e860 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65  en.  A new state
1e870 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
1e880 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e  created that can
1e890 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c   be used to roll
1e8a0 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20  back.** changes 
1e8b0 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  of a single SQL 
1e8c0 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61  command within a
1e8d0 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74   larger transact
1e8e0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1e8f0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
1e900 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
1e910 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
1e920 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1e930 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
1e940 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1e950 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1e960 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1e970 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
1e980 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
1e990 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64  2("STMT-BEGIN %d
1e9a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1e9b0 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
1e9c0 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
1e9d0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
1e9e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1e9f0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
1ea00 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75  dbSize;.    retu
1ea10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ea20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
1ea30 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
1ea40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1ea50 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  Autoopen = 1;.  
1ea60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ea70 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1ea80 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ea90 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65  lOpen );.  pPage
1eaa0 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c  r->aInStmt = sql
1eab0 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
1eac0 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1ead0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1eae0 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  >aInStmt==0 ){. 
1eaf0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c     /* sqlite3OsL
1eb00 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
1eb10 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f  SHARED_LOCK); */
1eb20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1eb30 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69  TE_NOMEM;.  }.#i
1eb40 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72  fndef NDEBUG.  r
1eb50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1eb60 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1eb70 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74  d, &pPager->stmt
1eb80 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
1eb90 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1eba0 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
1ebb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
1ebc0 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72  tJSize == pPager
1ebd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
1ebe0 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
1ebf0 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
1ec00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1ec10 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
1ec20 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1ec30 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
1ec40 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
1ec50 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
1ec60 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
1ec70 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
1ec80 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1ec90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1eca0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
1ecb0 70 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  p(&pPager->stfd)
1ecc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
1ecd0 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
1ece0 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65  ailed;.    pPage
1ecf0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b  r->stmtOpen = 1;
1ed00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1ed10 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNRec = 0;.  }. 
1ed20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1ed30 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  se = 1;.  return
1ed40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74   SQLITE_OK;. .st
1ed50 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a  mt_begin_failed:
1ed60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1ed70 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71  InStmt ){.    sq
1ed80 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
1ed90 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70  >aInStmt);.    p
1eda0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
1edb0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1edc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
1edd0 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74  mmit a statement
1ede0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1edf0 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
1ee00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ee10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ee20 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
1ee30 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
1ee40 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  t;.    PAGERTRAC
1ee50 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
1ee60 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1ee70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
1ee80 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
1ee90 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
1eea0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
1eeb0 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
1eec0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
1eed0 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f  er->stfd, 0); */
1eee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
1eef0 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  e( pPager->aInSt
1ef00 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  mt );.      pPag
1ef10 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
1ef20 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
1ef30 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
1ef40 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
1ef50 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
1ef60 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
1ef70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ef80 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20  Pg->inStmt );.  
1ef90 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
1efa0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1efb0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
1efc0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
1efd0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
1efe0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1eff0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1f000 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1f010 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1f020 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
1f030 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
1f040 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1f050 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1f060 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1f070 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
1f080 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1f090 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
1f0a0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1f0b0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1f0c0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
1f0d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f0e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
1f0f0 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
1f100 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1f110 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61  3PagerStmtRollba
1f120 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1f130 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1f140 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1f150 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
1f160 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
1f170 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
1f180 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1f190 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1f1a0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
1f1b0 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  g;.      for(pPg
1f1c0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
1f1d0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1f1e0 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20  extStmt){.      
1f1f0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1f200 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1f210 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1f220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
1f230 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
1f240 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
1f250 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1f260 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  , pHist->pStmt, 
1f270 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1f290 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
1f2a0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
1f2b0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
1f2c0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1f2d0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1f2e0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1f2f0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20  er->stmtSize;.  
1f300 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
1f310 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
1f320 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f330 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f340 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
1f350 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
1f360 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
1f370 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
1f380 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
1f390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1f3a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1f3b0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1f3c0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
1f3d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f3e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
1f3f0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
1f400 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1f410 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1f420 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1f430 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
1f440 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1f450 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
1f460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f470 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
1f480 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f490 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
1f4a0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
1f4b0 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  Dirname(Pager *p
1f4c0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1f4d0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
1f4e0 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ory;.}../*.** Re
1f4f0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
1f500 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  thname of the jo
1f510 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63  urnal file..*/.c
1f520 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1f530 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
1f540 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1f550 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1f560 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
1f570 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1f580 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
1f590 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
1f5a0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
1f5b0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
1f5c0 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
1f5d0 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
1f5e0 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
1f5f0 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50  te3PagerNosync(P
1f600 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1f610 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1f620 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  noSync;.}../*.**
1f630 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
1f640 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
1f650 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1f660 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
1f670 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
1f680 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
1f690 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
1f6a0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
1f6b0 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
1f6c0 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
1f6d0 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
1f6e0 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
1f6f0 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ecArg;.}../*.** 
1f700 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1f710 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
1f720 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
1f730 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
1f740 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
1f750 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
1f760 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
1f770 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f780 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1f790 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
1f7a0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
1f7b0 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
1f7c0 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
1f7d0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  t rc;..  if( !pP
1f7e0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1f7f0 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20  tDone ){.    /* 
1f800 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
1f810 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
1f820 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
1f830 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1f840 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
1f850 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
1f860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f870 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1f880 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f890 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ite(pPgHdr);.   
1f8a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f8b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1f8c0 20 20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74    .    /* Read t
1f8d0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1f8e0 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   at byte 24. */.
1f8f0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1f900 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62  er = retrieve32b
1f910 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b  its(pPgHdr, 24);
1f920 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65  .  .    /* Incre
1f930 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1f940 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1f950 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1f960 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
1f970 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1f980 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
1f990 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44  char*)PGHDR_TO_D
1f9a0 41 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c  ATA(pPgHdr))+24,
1f9b0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1f9c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43  ;.    pPager->iC
1f9d0 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 63 68 61  hangeCount = cha
1f9e0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 0a  nge_counter;.  .
1f9f0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
1fa00 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
1fa10 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  e. */.    sqlite
1fa20 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
1fa30 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  dr);.    pPager-
1fa40 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1fa50 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
1fa60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1fa70 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1fa80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1fa90 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
1faa0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
1fab0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
1fac0 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
1fad0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1fae0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1faf0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
1fb00 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
1fb10 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
1fb20 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
1fb30 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
1fb40 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
1fb50 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
1fb60 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1fb70 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1fb80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
1fb90 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
1fba0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
1fbb0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1fbc0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
1fbd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fbe0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1fbf0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
1fc00 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
1fc10 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
1fc20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
1fc30 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
1fc40 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1fc50 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
1fc60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fc70 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
1fc80 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1fc90 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
1fca0 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
1fcb0 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
1fcc0 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
1fcd0 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
1fce0 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 63 61  e3PagerSync() ca
1fcf0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
1fd00 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
1fd10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1fd20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
1fd30 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
1fd40 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
1fd50 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
1fd60 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1fd70 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73  bases)..*/.int s
1fd80 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
1fd90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
1fda0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1fdb0 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29  er, Pgno nTrunc)
1fdc0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1fdd0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52  ITE_OK;..  PAGER
1fde0 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
1fdf0 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
1fe00 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
1fe10 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
1fe20 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1fe30 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
1fe40 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
1fe50 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1fe60 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
1fe70 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
1fe80 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
1fe90 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
1fea0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1feb0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1fec0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1fed0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1fee0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
1fef0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1ff00 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
1ff10 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1ff20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ff30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1ff40 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
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 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
1ff70 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1ff80 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
1ff90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1ffa0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
1ffb0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
1ffc0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
1ffd0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
1ffe0 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
1fff0 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
20000 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
20010 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
20020 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
20030 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
20040 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
20050 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
20060 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
20070 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
20080 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
20090 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
200a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
200b0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
200c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
200d0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
200e0 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
200f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20100 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
20110 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
20120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20130 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
20140 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
20150 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
20160 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
20170 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
20180 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
20190 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
201a0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
201b0 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
201c0 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
201d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
201e0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
201f0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
20200 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
20210 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
20220 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
20230 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
20240 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
20250 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
20260 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
20270 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
20280 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49  if( !(pPager->aI
20290 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20  nJournal[i/8] & 
202a0 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69  (1<<(i&7))) && i
202b0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
202c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
202d0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
202e0 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20  er, i, &pPg);.  
202f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20310 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
20320 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20330 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20340 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
20350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
20360 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
20370 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20380 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20390 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
203a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
203b0 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66   .      }.#endif
203c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
203d0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
203e0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
203f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20400 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20410 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
20420 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
20430 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
20440 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20450 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
20460 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  xit;.    }..#ifn
20470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20480 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
20490 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
204a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
204b0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
204c0 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
204d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
204e0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
204f0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
20500 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
20510 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
20520 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
20530 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
20540 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
20550 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
20560 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
20570 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
20580 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
20590 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
205a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
205b0 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
205c0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
205d0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
205e0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
205f0 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
20600 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
20610 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20  ager->fd, 0);.  
20620 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
20630 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
20640 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
20650 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
20660 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
20670 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
20680 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
20690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
206a0 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
206b0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
206c0 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
206d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
206e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
206f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
20700 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
20710 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
20720 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  ata to location 
20730 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
20740 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
20750 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
20760 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72  nces to the curr
20770 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49  ent page pgno. I
20780 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a  f current page.*
20790 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  * pgno is not al
207a0 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c  ready in the rol
207b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
207c0 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  t is not written
207d0 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20   there by.** by 
207e0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68  this routine. Th
207f0 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74  e same applies t
20800 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61  o the page pData
20810 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e   refers to on en
20820 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  try to.** this r
20830 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
20840 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20850 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20  page refered to 
20860 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20  by pData remain 
20870 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
20880 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
20890 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
208a0 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65   page pData (i.e
208b0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
208c0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
208d0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
208e0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
208f0 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
20900 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
20910 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
20920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
20930 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
20940 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20950 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
20960 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
20970 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
20980 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
20990 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
209a0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
209b0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
209c0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
209d0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
209e0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
209f0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
20a00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
20a10 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
20a20 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
20a30 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
20a40 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
20a50 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
20a60 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20  Hdr *pPgOld; .  
20a70 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65  int h;.  Pgno ne
20a80 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a  edSyncPgno = 0;.
20a90 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
20aa0 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47  nRef>0 );..  PAG
20ab0 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25  ERTRACE5("MOVE %
20ac0 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
20ad0 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
20ae0 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
20af0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
20b00 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
20b10 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
20b20 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
20b30 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
20b40 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
20b50 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66 28 20  , pgno))..  if( 
20b60 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
20b70 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
20b80 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
20b90 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
20ba0 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
20bb0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
20bc0 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
20bd0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
20be0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
20bf0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
20c00 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
20c10 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
20c20 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
20c30 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
20c40 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
20c50 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
20c60 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
20c70 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
20c80 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
20c90 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
20ca0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
20cb0 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
20cc0 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
20cd0 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
20ce0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
20cf0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
20d00 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
20d10 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
20d20 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
20d30 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
20d40 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
20d50 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
20d60 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
20d70 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
20d80 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
20d90 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
20da0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
20db0 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70  gOld);.    if( p
20dc0 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
20dd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20de0 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
20df0 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
20e00 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
20e10 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
20e20 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
20e30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
20e40 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
20e50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
20e60 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
20e70 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
20e80 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
20e90 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
20ea0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67   */.  assert( pg
20eb0 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  no!=0 );.  pPg->
20ec0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
20ed0 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
20ee0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69  r->nHash-1);.  i
20ef0 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
20f00 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [h] ){.    asser
20f10 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
20f20 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  [h]->pPrevHash==
20f30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
20f40 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
20f50 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Hash = pPg;.  }.
20f60 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
20f70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
20f80 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  [h];.  pPager->a
20f90 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
20fa0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
20fb0 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74  = 0;..  makeDirt
20fc0 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
20fd0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
20fe0 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
20ff0 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
21000 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
21010 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
21020 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
21030 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
21040 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
21050 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
21060 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
21070 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
21080 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
21090 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
210a0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
210b0 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
210c0 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
210d0 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e      ** Pager.aIn
210e0 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
210f0 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
21100 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
21110 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
21120 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
21130 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
21140 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
21150 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
21160 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
21170 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
21180 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
21190 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
211a0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
211b0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
211c0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
211d0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
211e0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
211f0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
21200 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
21210 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21220 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
21230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21240 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
21250 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
21260 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
21270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21280 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
21290 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
212a0 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
212b0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
212c0 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75     pPgHdr->inJou
212d0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61  rnal = 1;.    ma
212e0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
212f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
21300 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
21310 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
21320 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
21330 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
21340 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
21350 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
21360 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
21370 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
21380 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
21390 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
213a0 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
213b0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
213c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
213d0 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
213e0 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
213f0 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
21400 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
21410 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
21420 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
21430 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
21440 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
21450 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
21460 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
21470 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
21480 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54  ger?PGHDR_TO_EXT
21490 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a  RA(pPg, pPager):
214a0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
214b0 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
214c0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
214d0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
214e0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
214f0 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
21500 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
21510 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
21520 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
21530 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
21540 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
21550 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
21560 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
21570 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
21580 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
21590 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
215a0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
215b0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
215c0 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
215d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
215e0 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
215f0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
21600 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
21610 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
21620 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
21630 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
21640 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21650 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
21660 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
21670 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20  t eMode){.  if( 
21680 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20  eMode>=0 ){.    
21690 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
216a0 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20  eMode = eMode;. 
216b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
216c0 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
216d0 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64  veMode;.}..#if d
216e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
216f0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
21700 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
21710 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
21720 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
21730 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72  he file lock for
21740 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
21750 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
21760 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20  value is one of 
21770 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f  NO_LOCK, SHARED_
21780 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
21790 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  OCK,.** PENDING_
217a0 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49  LOCK, or EXCLUSI
217b0 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  VE_LOCK..*/.int 
217c0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
217d0 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
217e0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ger){.  return s
217f0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74  qlite3OsLockStat
21800 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d  e(pPager->fd);.}
21810 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
21820 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
21830 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
21840 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
21850 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
21860 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
21870 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21880 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65  agerRefdump(Page
21890 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
218a0 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
218b0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
218c0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
218d0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
218e0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
218f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21900 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
21910 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
21920 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
21930 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
21940 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
21950 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
21960 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
21970 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
21980 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
21990 2f 0a                                            /.