/ Hex Artifact Content
Login

Artifact 9fa154fbc5f511dedadc9f9df87df6b103c0303a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 34  : pager.c,v 1.34
0350: 31 20 32 30 30 37 2f 30 35 2f 32 34 20 30 37 3a  1 2007/05/24 07:
0360: 32 32 3a 34 32 20 64 61 6e 69 65 6c 6b 31 39 37  22:42 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
03b0: 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e  clude "os.h".#in
03c0: 63 6c 75 64 65 20 22 70 61 67 65 72 2e 68 22 0a  clude "pager.h".
03d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03f0: 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d  ring.h>../*.** M
0400: 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c  acros for troubl
0410: 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d  eshooting.  Norm
0420: 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a  ally turned off.
0430: 2a 2f 0a 23 69 66 20 30 0a 23 64 65 66 69 6e 65  */.#if 0.#define
0440: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0450: 6e 74 66 20 70 72 69 6e 74 66 0a 23 64 65 66 69  ntf printf.#defi
0460: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0470: 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  )       sqlite3D
0480: 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64  ebugPrintf(X).#d
0490: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
04a0: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  Y).#define PAGER
04d0: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
04e0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
04f0: 74 66 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  tf(X,Y,Z).#defin
0500: 65 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c  e PAGERTRACE4(X,
0510: 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65  Y,Z,W) sqlite3De
0520: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0530: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
0540: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
0550: 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  ) sqlite3DebugPr
0560: 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a  intf(X,Y,Z,W,V).
0570: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
0580: 47 45 52 54 52 41 43 45 31 28 58 29 0a 23 64 65  GERTRACE1(X).#de
0590: 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45 32  fine PAGERTRACE2
05a0: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 50 41  (X,Y).#define PA
05b0: 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  GERTRACE3(X,Y,Z)
05c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
05d0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64  ACE4(X,Y,Z,W).#d
05e0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05f0: 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6e  5(X,Y,Z,W,V).#en
0600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
0610: 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63  ollowing two mac
0620: 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ros are used wit
0630: 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41  hin the PAGERTRA
0640: 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  CEX() macros abo
0650: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0660: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0670: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0680: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0690: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
06a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20   struct as it's 
06b0: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a  argument. The.**
06c0: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
06d0: 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72  -descriptor is r
06e0: 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e  eturned. FILEHAN
06f0: 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e  DLEID() takes an
0700: 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63   OsFile.** struc
0710: 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65  t as it's argume
0720: 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  nt..*/.#define P
0730: 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29  AGERID(p) ((int)
0740: 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65  (p->fd)).#define
0750: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0760: 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a  ) ((int)fd)../*.
0770: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0780: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0790: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
07a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
07b0: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
07c0: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
07d0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
07e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
07f0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
0800: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
0810: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
0820: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
0830: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0840: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0850: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0860: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0870: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0880: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08a0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
08b0: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
08c0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
08d0: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
08e0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
0910: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
0920: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0950: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0960: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0980: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0990: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
09a0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
09b0: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
09c0: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
09d0: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
09e0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
09f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a00: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
0a10: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
0a20: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
0a30: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0a60: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0a70: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0a80: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0ab0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0ac0: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
0af0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
0b00: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
0b10: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
0b20: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0b30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0b40: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0b50: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0b60: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0b70: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0ba0: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0bb0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0bc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
0be0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
0bf0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
0c00: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0c30: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0c40: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0c50: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0c60: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0c70: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0c80: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0ca0: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0cb0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0cc0: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0cf0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0d00: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0d10: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0d30: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0d40: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0d50: 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20  emove or.**     
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a    truncate the j
0d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
0d90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0da0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0db0: 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62            will b
0dc0: 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  e committed..**.
0dd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0de0: 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41  e comes up in PA
0df0: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0e00: 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a   first time a.**
0e10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
0e20: 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73  () occurs, the s
0e30: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e40: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
0e50: 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70  ..** After all p
0e60: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ages have been r
0e70: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
0e80: 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28  lite_page_unref(
0e90: 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ),.** the state 
0ea0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b  transitions back
0eb0: 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   to PAGER_UNLOCK
0ec0: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0ed0: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0ee0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
0ef0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f00: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f10: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f20: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
0f40: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0f50: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0f60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0f70: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0f80: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0f90: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0fa0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
0fb0: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
0fc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0fd0: 29 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  ).** PAGER_RESER
0fe0: 56 45 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74  VED means that t
0ff0: 68 65 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20  here is an open 
1000: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1010: 2e 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ..** The transit
1020: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1030: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 62 65  LUSIVE occurs be
1040: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1050: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1060: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1070: 65 2c 20 74 68 6f 75 67 68 20 77 72 69 74 65 73  e, though writes
1080: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
1090: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75  .** journal occu
10a0: 72 73 20 77 69 74 68 20 6a 75 73 74 20 50 41 47  rs with just PAG
10b0: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66  ER_RESERVED.  Af
10c0: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61  ter an sqlite3Pa
10d0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  gerRollback().**
10e0: 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
10f0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1100: 2c 20 74 68 65 20 73 74 61 74 65 20 63 61 6e 20  , the state can 
1110: 67 6f 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  go back to PAGER
1120: 5f 53 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69  _SHARED,.** or i
1130: 74 20 63 61 6e 20 73 74 61 79 20 61 74 20 50 41  t can stay at PA
1140: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66  GER_EXCLUSIVE if
1150: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
1160: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
1170: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1180: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1190: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
11a0: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
11b0: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
11c0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
11d0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
11e0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
11f0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
1200: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1210: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1220: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1230: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1240: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1250: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1260: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1270: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1280: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1290: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
12a0: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
12b0: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
12c0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
12d0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
12e0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12f0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
1300: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
1310: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1320: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1330: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1340: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1350: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1360: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1370: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1380: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1390: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
13a0: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
13b0: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
13c0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
13d0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
13e0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
13f0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
1400: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
1410: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1420: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1430: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1440: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1450: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1460: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1470: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1480: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1490: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
14a0: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
14b0: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
14c0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
14d0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
14e0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
14f0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
1500: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
1510: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1520: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1530: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1540: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1550: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1560: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1570: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1580: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1590: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
15a0: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
15b0: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
15c0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
15d0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
15e0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
15f0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
1600: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
1610: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1620: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1630: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1640: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1650: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1660: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1670: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1680: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1690: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
16a0: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
16b0: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
16c0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
16d0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
16e0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
16f0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
1700: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1710: 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70  te() on a page p
1720: 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a  rior to making.*
1730: 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69  * any modificati
1740: 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65  ons to that page
1750: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
1760: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1770: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1780: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1790: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17a0: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
17b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
17c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
17d0: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
17e0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
17f0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
1800: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
1810: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
1820: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
1830: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1840: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1850: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1860: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1870: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1880: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1890: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
18a0: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
18b0: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
18c0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
18d0: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
18e0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
18f0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
1900: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
1910: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
1920: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
1930: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
1940: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
1950: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
1960: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1970: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1980: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1990: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
19a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
19b0: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
19c0: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
19d0: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
19e0: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
19f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1a00: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
1a10: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
1a20: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
1a50: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
1a60: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a70: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a80: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a90: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1aa0: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1ab0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1ac0: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1ad0: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1ae0: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1af0: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1b00: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1b20: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1b30: 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e   */.  u8 inJourn
1b40: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1b50: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20       /* TRUE if 
1b60: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
1b70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
1b80: 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20 20   u8 dirty;      
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e 65  /* TRUE if we ne
1bb0: 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63 6b  ed to write back
1bc0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38   changes */.  u8
1bd0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bf0: 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66  Sync journal bef
1c00: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69 73  ore writing this
1c10: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c   page */.  u8 al
1c20: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73            /* Dis
1c40: 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  able DontRollbac
1c50: 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61 67  k() for this pag
1c60: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 52 65  e */.  u8 needRe
1c70: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
1c80: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 63 6f        /* Read co
1c90: 6e 74 65 6e 74 20 69 66 20 50 61 67 65 72 57 72  ntent if PagerWr
1ca0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1cb0: 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e  */.  short int n
1cc0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1cd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ce0: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
1cf0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1d00: 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69  pDirty, *pPrevDi
1d10: 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79  rty;    /* Dirty
1d20: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20   pages */.  u32 
1d30: 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  notUsed;        
1d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1d50: 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69  ffer space */.#i
1d60: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1d70: 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61  K_PAGES.  u32 pa
1d80: 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20  geHash;.#endif. 
1d90: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /* pPager->page
1da0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61  Size bytes of pa
1db0: 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  ge data follow t
1dc0: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  his header */.  
1dd0: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
1de0: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
1df0: 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  ata follow the p
1e00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  age data */.};..
1e10: 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  /*.** For an in-
1e20: 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61  memory only data
1e30: 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61  base, some extra
1e40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1e50: 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a  recorded about.*
1e60: 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74  * each page so t
1e70: 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20  hat changes can 
1e80: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1e90: 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20   (Journal files 
1ea0: 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20  are not.** used 
1eb0: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1ec0: 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66  tabases.)  The f
1ed0: 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61  ollowing informa
1ee0: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f  tion is added to
1ef0: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65  .** the end of e
1f00: 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b  very EXTRA block
1f10: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1f20: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
1f30: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1f40: 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
1f50: 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20   added directly 
1f60: 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72  to the PgHdr str
1f70: 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74  ucture..** But t
1f80: 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b  hen it would tak
1f90: 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20  e up an extra 8 
1fa0: 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65  bytes of storage
1fb0: 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a   on every PgHdr.
1fc0: 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b  ** even for disk
1fd0: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73  -based databases
1fe0: 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20  .  Splitting it 
1ff0: 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65  out saves 8 byte
2000: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  s.  This.** is o
2010: 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66  nly a savings of
2020: 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20   0.8% but those 
2030: 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20  percentages add 
2040: 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  up..*/.typedef s
2050: 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20  truct PgHistory 
2060: 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63  PgHistory;.struc
2070: 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20  t PgHistory {.  
2080: 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f  u8 *pOrig;     /
2090: 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  * Original page 
20a0: 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74  text.  Restore t
20b0: 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c  o this on a full
20c0: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75   rollback */.  u
20d0: 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a  8 *pStmt;     /*
20e0: 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20   Text as it was 
20f0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2100: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2110: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50  statement */.  P
2120: 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c  gHdr *pNextStmt,
2130: 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a   *pPrevStmt;  /*
2140: 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   List of pages i
2150: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
2160: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2170: 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  inStmt;         
2180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2190: 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74  RUE if in the st
21a0: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
21b0: 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  al */.};../*.** 
21c0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
21d0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
21e0: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
21f0: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
2200: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
2210: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
2220: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
2230: 43 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78  Codec!=0 ){ P->x
2240: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2250: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64  rg,D,N,X); }.# d
2260: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
2270: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50  ,N,X) ((char*)(P
2280: 2d 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78  ->xCodec!=0?P->x
2290: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
22a0: 72 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65  rg,D,N,X):D)).#e
22b0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  lse.# define COD
22c0: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20  EC1(P,D,N,X) /* 
22d0: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# defin
22e0: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
22f0: 29 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e  ) ((char*)D).#en
2300: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  dif../*.** Conve
2310: 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rt a pointer to 
2320: 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70  a PgHdr into a p
2330: 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61  ointer to its da
2340: 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61  ta.** and back a
2350: 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  gain..*/.#define
2360: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50   PGHDR_TO_DATA(P
2370: 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29  )  ((void*)(&(P)
2380: 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41  [1])).#define DA
2390: 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20  TA_TO_PGHDR(D)  
23a0: 28 26 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b  (&((PgHdr*)(D))[
23b0: 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  -1]).#define PGH
23c0: 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29  DR_TO_EXTRA(G,P)
23d0: 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72   ((void*)&((char
23e0: 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29  *)(&(G)[1]))[(P)
23f0: 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65  ->pageSize]).#de
2400: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49  fine PGHDR_TO_HI
2410: 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20  ST(P,PGR)  \.   
2420: 20 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73           ((PgHis
2430: 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28  tory*)&((char*)(
2440: 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d  &(P)[1]))[(PGR)-
2450: 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d  >pageSize+(PGR)-
2460: 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a  >nExtra])../*.**
2470: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
2480: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
2490: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
24a0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
24b0: 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64  .** Pager.errCod
24c0: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
24d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
24e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
24f0: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  .** or SQLITE_FU
2500: 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20  LL. Once one of 
2510: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
2520: 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69  errors occurs, i
2530: 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e  t persists.** an
2540: 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  d is returned as
2550: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65   the result of e
2560: 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72  very major pager
2570: 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a   API call.  The.
2580: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72  ** SQLITE_FULL r
2590: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
25a0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
25b0: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
25c0: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
25d0: 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20  next successful 
25e0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66  rollback is perf
25f0: 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67  ormed on the pag
2600: 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a  er cache. Also,.
2610: 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64  ** SQLITE_FULL d
2620: 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74  oes not affect t
2630: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2640: 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
2650: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  PagerLookup().**
2660: 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20   APIs, they may 
2670: 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75  still be used su
2680: 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73  ccessfully..*/.s
2690: 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20  truct Pager {.  
26a0: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26c0: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
26d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
26e0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
26f0: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
2700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2710: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
2720: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2730: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
2740: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
2750: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
2760: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
2770: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
2780: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
2790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
27a0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
27b0: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
27c0: 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b  /.  u8 stmtOpen;
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
27f0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
2800: 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20  nal is open */. 
2810: 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20   u8 stmtInUse;  
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2830: 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61  True we are in a
2840: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
2850: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  ansaction */.  u
2860: 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20  8 stmtAutoopen; 
2870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2880: 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20  en stmt journal 
2890: 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  when main journa
28a0: 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20  l is opened*/.  
28b0: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
28d0: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
28e0: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
28f0: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
2920: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
2930: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
2940: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f 66 73 79  */.  u8 full_fsy
2950: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2960: 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c 4c 46 53   /* Use F_FULLFS
2970: 59 4e 43 20 77 68 65 6e 20 61 76 61 69 6c 61 62  YNC when availab
2980: 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  le */.  u8 state
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
29b0: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
29c0: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
29d0: 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20  .  u8 tempFile; 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f0: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61  * zFilename is a
2a00: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2a10: 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79  */.  u8 readOnly
2a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a30: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
2a40: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
2a50: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  e */.  u8 needSy
2a60: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2a80: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
2a90: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
2aa0: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43  l */.  u8 dirtyC
2ab0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2ac0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
2ad0: 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20  ched pages have 
2ae0: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
2af0: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
2b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
2b10: 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  ble DontRollback
2b20: 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  () for all pages
2b30: 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20   */.  u8 memDb; 
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68    /* True to inh
2b60: 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f  ibit all file I/
2b70: 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73  O */.  u8 setMas
2b80: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
2b90: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2ba0: 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65  m-j name has bee
2bb0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e  n written to jrn
2bc0: 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  l */.  u8 doNotS
2bd0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2be0: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57     /* Boolean. W
2bf0: 68 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f  hile true, do no
2c00: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
2c10: 65 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73  e */.  u8 exclus
2c20: 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  iveMode;        
2c30: 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54     /* Boolean. T
2c40: 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d  rue if locking_m
2c50: 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a  ode==EXCLUSIVE *
2c60: 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75  /.  u8 changeCou
2c70: 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  ntDone;         
2c80: 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63  /* Set after inc
2c90: 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68  rementing the ch
2ca0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  ange-counter */.
2cb0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cd0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2ce0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2d20: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
2d30: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2d40: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2d50: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
2d60: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
2d70: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
2d80: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
2d90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2da0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2db0: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2dc0: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  in() */.  int nR
2dd0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
2de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2df0: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
2e00: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2e10: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
2e20: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
2e30: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
2e40: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
2e50: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
2e60: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63  /.  int stmtNRec
2e70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
2e90: 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62  ords in stmt sub
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2eb0: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
2ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2ed0: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
2ee0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
2ef0: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
2f00: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2f20: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2f30: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  page */.  int nP
2f40: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f50: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
2f60: 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
2f70: 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  ry pages */.  in
2f80: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
2f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2fa0: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2fb0: 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64   pages with PgHd
2fc0: 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e  r.nRef>0 */.  in
2fd0: 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20  t mxPage;       
2fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
2ff0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70  imum number of p
3000: 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20  ages to hold in 
3010: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
3020: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
3030: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3040: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
3050: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
3060: 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e  /.  u8 *aInJourn
3070: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
3080: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
3090: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
30a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30b0: 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20  .  u8 *aInStmt; 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
30e0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
30f0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
3100: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
3110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3120: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3130: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
3140: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
3150: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3160: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3170: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
3180: 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20  irectory;       
3190: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
31a0: 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61   hold database a
31b0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
31c0: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64   */.  OsFile *fd
31d0: 2c 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  , *jfd;         
31e0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
31f0: 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61  ptors for databa
3200: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a  se and journal *
3210: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64  /.  OsFile *stfd
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
3240: 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  or for the state
3250: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a  ment subjournal*
3260: 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
3270: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20  *pBusyHandler;  
3280: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
3290: 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72  lite.busyHandler
32a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
32b0: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
32c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
32d0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
32e0: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
32f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
3300: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
3310: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
3320: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
3330: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
3340: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
3350: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
3360: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
3370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
3380: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
3390: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
33a0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64  ournal */.  PgHd
33b0: 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20  r *pDirty;      
33c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
33d0: 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  of all dirty pag
33e0: 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  es */.  i64 jour
33f0: 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20  nalOff;         
3400: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62      /* Current b
3410: 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  yte offset in th
3420: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3430: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  /.  i64 journalH
3440: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
3450: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74  /* Byte offset t
3460: 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e  o previous journ
3470: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  al header */.  i
3480: 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20  64 stmtHdrOff;  
3490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
34a0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
34b0: 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20  er written this 
34c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
34d0: 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20  64 stmtCksum;   
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b             /* ck
34f0: 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61  sumInit when sta
3500: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
3510: 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  ed */.  i64 stmt
3520: 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  JSize;          
3530: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
3540: 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62  ournal at stmt_b
3550: 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
3560: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
3570: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
3580: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
3590: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
35a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
35b0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
35c0: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
35d0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
35e0: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
35f0: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
3600: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
3610: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
3620: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
3630: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
3640: 78 44 65 73 74 72 75 63 74 6f 72 29 28 44 62 50  xDestructor)(DbP
3650: 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  age*,int); /* Ca
3660: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3670: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
3680: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
3690: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
36a0: 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c  *,int);   /* Cal
36b0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
36c0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
36d0: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
36e0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
36f0: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
3700: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
3710: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
3720: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
3730: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
3740: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
3750: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3760: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
3770: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
3780: 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20  .  int nHash;   
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
37b0: 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a  ger hash table *
37c0: 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  /.  PgHdr **aHas
37d0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
37e0: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
37f0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
3800: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66   to PgHdr */.#if
3810: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3820: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
3830: 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65  ENT.  Pager *pNe
3840: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
3850: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
3860: 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68   of pagers in th
3870: 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e  is thread */.#en
3880: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
3890: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
38a0: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
38b0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
38c0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
38d0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
38e0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
38f0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
3900: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
3910: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a  e changes */.};.
3920: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
3930: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
3940: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
3950: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
3960: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
3970: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
3980: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
3990: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
39a0: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
39b0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
39c0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
39d0: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
39e0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
39f0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
3a00: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
3a10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3a20: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
3a30: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
3a40: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3a50: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
3a60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
3a70: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
3a80: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
3a90: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
3aa0: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
3ab0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
3ac0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3ad0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
3ae0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
3af0: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
3b00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3b10: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
3b20: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
3b30: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
3b40: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
3b50: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
3b60: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
3b70: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
3b80: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
3b90: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
3ba0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
3bb0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
3bc0: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
3bd0: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
3be0: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
3c00: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
3c10: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3c20: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
3c30: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
3c40: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3c50: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
3c60: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
3c70: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
3c80: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
3c90: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
3ca0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
3cb0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
3cc0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
3cd0: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
3ce0: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
3cf0: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
3d00: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
3d10: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
3d20: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
3d30: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
3d40: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
3d50: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
3d60: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
3d70: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
3d80: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
3d90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
3da0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
3db0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
3dc0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3dd0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
3de0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
3df0: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
3e00: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
3e10: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
3e20: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
3e30: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
3e40: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
3e50: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
3e60: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
3e70: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
3e80: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
3e90: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
3ea0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
3eb0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
3ec0: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
3ed0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
3ee0: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
3ef0: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
3f00: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
3f10: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
3f20: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
3f30: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
3f40: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
3f50: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
3f60: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
3f70: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
3f80: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
3f90: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
3fa0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
3fb0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
3fc0: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
3fd0: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
3fe0: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
3ff0: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
4000: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
4010: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
4020: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
4030: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
4040: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
4050: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
4060: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
4070: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
4080: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
4090: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
40a0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
40b0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
40c0: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
40d0: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
40e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
40f0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
4100: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
4110: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4120: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
4130: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
4140: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
4150: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
4160: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
4170: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
4180: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
4190: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
41a0: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
41b0: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
41c0: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
41d0: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
41e0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
41f0: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
4200: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
4210: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
4220: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
4230: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
4240: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
4250: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4260: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4270: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4280: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4290: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
42a0: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
42b0: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
42c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
42d0: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
42e0: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
42f0: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4300: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
4310: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
4320: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
4330: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
4340: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
4350: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
4360: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4370: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4380: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
43a0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
43b0: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
43c0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
43d0: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
43e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
43f0: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
4400: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
4410: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
4420: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
4430: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
4440: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
4450: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
4460: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
4470: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
4480: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
4490: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
44a0: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
44b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
44c0: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
44d0: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
44e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
44f0: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
4500: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
4510: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
4520: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
4530: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
4540: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
4550: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
4560: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
4570: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
4580: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
4590: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
45a0: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
45b0: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
45c0: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
45d0: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
45e0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
45f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
4600: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
4610: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
4620: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
4630: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72  ../*.** Enable r
4640: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74  eference count t
4650: 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62  racking (for deb
4660: 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f  ugging) here:.*/
4670: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4680: 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72  EBUG.  int pager
4690: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
46a0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
46b0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
46c0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
46d0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
46e0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
46f0: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
4700: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
4710: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4720: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
4730: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
4740: 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61  p nRef=%-3d tota
4750: 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
4760: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4770: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
4780: 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e  ef, p->pPager->n
4790: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
47a0: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
47b0: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
47c0: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
47d0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
47e0: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
47f0: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
4800: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4810: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
4820: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4830: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
4840: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
4850: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
4860: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
4870: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
4880: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
4890: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
48a0: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
48b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
48c0: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
48d0: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
48e0: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
48f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
4900: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
4910: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
4920: 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f     return PGHDR_
4930: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
4940: 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20  ger)->inStmt;.  
4950: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
4960: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4970: 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50  ;.    u8 *a = pP
4980: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20  ager->aInStmt;. 
4990: 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26 20     return (a && 
49a0: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
49b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28  r->stmtSize && (
49c0: 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  a[pgno/8] & (1<<
49d0: 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d  (pgno&7))));.  }
49e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
49f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
4a00: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
4a10: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
4a20: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
4a30: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
4a40: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
4a50: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
4a60: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
4a70: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
4a80: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
4a90: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
4aa0: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48  N-1))==0 );.  aH
4ab0: 61 73 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ash = sqliteMall
4ac0: 6f 63 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  oc( sizeof(aHash
4ad0: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20  [0])*N );.  if( 
4ae0: 61 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20  aHash==0 ){.    
4af0: 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65  /* Failure to re
4b00: 68 61 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65  hash is not an e
4b10: 72 72 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c  rror.  It is onl
4b20: 79 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  y a performance 
4b30: 68 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  hit. */.    retu
4b40: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
4b50: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
4b60: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
4b70: 48 61 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67  Hash = N;.  pPag
4b80: 65 72 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73  er->aHash = aHas
4b90: 68 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  h;.  for(pPg=pPa
4ba0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
4bb0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
4bc0: 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  l){.    int h;. 
4bd0: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
4be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
4bf0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
4c00: 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
4c10: 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
4c20: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
4c30: 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67     }.    h = pPg
4c40: 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a  ->pgno & (N-1);.
4c50: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
4c60: 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20  sh = aHash[h];. 
4c70: 20 20 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20     if( aHash[h] 
4c80: 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68  ){.      aHash[h
4c90: 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
4ca0: 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48  Pg;.    }.    aH
4cb0: 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
4cc0: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
4cd0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
4ce0: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4cf0: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4d00: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d10: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4d20: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4d30: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4d40: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4d50: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4d60: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4d70: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4d80: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4d90: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4da0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4db0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4dc0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4de0: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4df0: 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  d, u32 *pRes){. 
4e00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4e10: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4e20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4e30: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4e40: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4e60: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
4e70: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
4e80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4e90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4ea0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4eb0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
4ec0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
4ed0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
4ee0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
4ef0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
4f00: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
4f10: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4f20: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4f30: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4f40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4f50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4f60: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4f70: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4f80: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4f90: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4fa0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4fb0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4fc0: 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20  32 val){.  char 
4fd0: 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69  ac[4];.  put32bi
4fe0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72  ts(ac, val);.  r
4ff0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
5000: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
5010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
5020: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5030: 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73 65  at offset 'offse
5040: 74 27 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  t' from the page
5050: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a   identified by.*
5060: 2a 20 70 61 67 65 20 68 65 61 64 65 72 20 27 70  * page header 'p
5070: 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  '..*/.static u32
5080: 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
5090: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
50a0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
50b0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
50c0: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
50d0: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
50e0: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
50f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5100: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 7d 0a  Get4byte(ac);.}.
5110: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
5120: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
5130: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 65  called when an e
5140: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
5150: 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  in the pager.** 
5160: 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74 20  code. The first 
5170: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
5180: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
5190: 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  er structure, th
51a0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65 20  e.** second the 
51b0: 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
51c0: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
51d0: 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20 66  by a pager API f
51e0: 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65  unction. .** The
51f0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5200: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
5210: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5220: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
5230: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
5240: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
5250: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
5260: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
5270: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
5280: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
5290: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
52a0: 2e 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  . All subsequent
52b0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
52c0: 69 73 20 50 61 67 65 72 0a 2a 2a 20 77 69 6c 6c  is Pager.** will
52d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74   immediately ret
52e0: 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
52f0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
5300: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
5310: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
5320: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
5330: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
5340: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
5350: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
5360: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67  ITE_FULL || pPag
5370: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
5380: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 0a  ITE_OK );.  if(.
5390: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
53a0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
53b0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
53c0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
53d0: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
53e0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
53f0: 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  e = rc;.  }.  re
5400: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
5410: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
5420: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
5430: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
5440: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
5450: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
5460: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
5470: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
5480: 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68  *pPage){.  u32 h
5490: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
54a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
54b0: 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69  r *pData = (unsi
54c0: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
54d0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
54e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
54f0: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
5500: 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  geSize; i++){.  
5510: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69    hash = (hash+i
5520: 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  )^pData[i];.  }.
5530: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
5540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
5550: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
5560: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
5570: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
5580: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5590: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
55a0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
55b0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
55c0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
55d0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
55e0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
55f0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
5600: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
5610: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
5620: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
5630: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
5640: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
5650: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
5660: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
5670: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5680: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
5690: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
56a0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
56b0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44  >errCode || MEMD
56c0: 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20  B || pPg->dirty 
56d0: 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  || .      pPg->p
56e0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
56f0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
5700: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
5710: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
5720: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
5730: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
5740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5750: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
5760: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
5770: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
5780: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5790: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
57a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
57b0: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
57c0: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
57d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
57e0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
57f0: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
5800: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5810: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
5820: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
5830: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
5840: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
5850: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
5860: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
5870: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
5880: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
5890: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
58a0: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
58b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
58d0: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
58e0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
58f0: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
5900: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
5910: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
5920: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
5930: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5940: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
5950: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
5960: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
5970: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
5980: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
5990: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
59a0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
59b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
59c0: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
59d0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
59e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
59f0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a  pJrnl, szJ-16);.
5a00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5a10: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5a20: 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  . .  rc = read32
5a30: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e  bits(pJrnl, &len
5a40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5a50: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5a60: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
5a70: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63  32bits(pJrnl, &c
5a80: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
5a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5aa0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5ab0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5ac0: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b  rnl, aMagic, 8);
5ad0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5ae0: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
5af0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
5b00: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
5b10: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
5b20: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
5b30: 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  l, szJ-16-len);.
5b40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5b50: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5b60: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
5b70: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
5b80: 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69  lloc(len+1);.  i
5b90: 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b  f( !*pzMaster ){
5ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5bb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5bd0: 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73  ad(pJrnl, *pzMas
5be0: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
5bf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5c00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5c10: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5c20: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5c30: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5c40: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
5c50: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
5c60: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
5c70: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
5c80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
5c90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
5ca0: 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29  m -= (*pzMaster)
5cb0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [i];.  }.  if( c
5cc0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
5cd0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
5ce0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
5cf0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
5d00: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
5d10: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
5d20: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
5d40: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
5d50: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
5d60: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
5d70: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
5d80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5d90: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
5da0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
5db0: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
5dc0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  me..    */.    s
5dd0: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5de0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5df0: 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ter = 0;.  }else
5e00: 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72  {.    (*pzMaster
5e10: 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  )[len] = '\0';. 
5e20: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
5e30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5e40: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
5e50: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5e60: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
5e70: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
5e80: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
5e90: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
5ea0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
5eb0: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
5ec0: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
5ed0: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
5ee0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
5ef0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
5f00: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
5f10: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
5f20: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
5f30: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
5f40: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
5fd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5fe0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
5ff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
6000: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
6010: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
6020: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
6030: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
6040: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
6050: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
6060: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
6070: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6080: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
6090: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
60a0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
60b0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
60c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
60d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
60e0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
60f0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
6100: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6110: 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67  Pager) );.  pPag
6120: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
6130: 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72   offset;.  retur
6140: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  n sqlite3OsSeek(
6150: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
6160: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
6170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
6180: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
6190: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
61a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
61b0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
61c0: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
61d0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
61e0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
61f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6200: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
6210: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
6220: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
6230: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
6240: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
6250: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
6260: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
6270: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
6280: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
6290: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
62a0: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
62b0: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
62c0: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
62d0: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
62e0: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
62f0: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
6300: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
6310: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
6320: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
6330: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
6340: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
6350: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
6360: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
6370: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
6380: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6390: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
63a0: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
63b0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
63c0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
63d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61   *pPager){.  cha
63e0: 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  r zHeader[sizeof
63f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6400: 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  16];.  int rc;..
6410: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
6420: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
6430: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
6440: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
6450: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
6460: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
6470: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6480: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6490: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
64a0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
64b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
64c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
64d0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
64e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
64f0: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
6500: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
6510: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
6520: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
6530: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
6540: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
6550: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
6560: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
6570: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
6580: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
6590: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
65a0: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
65b0: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
65c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
65d0: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
65e0: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
65f0: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
6600: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65   this..  */.  me
6610: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
6620: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6630: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6640: 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52  c));.  /* The nR
6650: 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46  ec Field. 0xFFFF
6660: 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63  FFFF for no-sync
6670: 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20   journals. */.  
6680: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6690: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
66a0: 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
66b0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
66c0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f  ffffff : 0);.  /
66d0: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
66e0: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
66f0: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
6700: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
6710: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
6720: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
6730: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
6740: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6750: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6760: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
6770: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6780: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
6790: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
67a0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
67b0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
67c0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
67d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
67e0: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
67f0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
6800: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
6810: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6820: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6830: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
6840: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
6850: 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  Size);.  IOTRACE
6860: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
6870: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
6880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
6890: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
68a0: 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69  r))).  rc = sqli
68b0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
68c0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
68d0: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
68e0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
68f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20  rnal header has 
6900: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63  been written suc
6910: 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20  cessfully. Seek 
6920: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
6930: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6940: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
6950: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6960: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20  r sector..  */. 
6970: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6980: 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  OK ){.    IOTRAC
6990: 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c  E(("JTAIL %p %ll
69a0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
69b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
69c0: 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  -1)).    rc = sq
69d0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
69e0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
69f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
6a00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6a10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
6a20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6a30: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6a40: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6a50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6a60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6a80: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6a90: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
6aa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6ab0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6ac0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
6ad0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6ae0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6af0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
6b00: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
6b10: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6b20: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6b30: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6b40: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6b60: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6b70: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
6b80: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6b90: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
6ba0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
6bb0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6bc0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
6bd0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
6be0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
6bf0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
6c00: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
6c10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6c20: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6c30: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6c40: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6c50: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6c60: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6c70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
6c80: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6c90: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
6ca0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
6cb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6cc0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
6cd0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
6ce0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
6cf0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
6d00: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
6d10: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6d20: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6d30: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6d40: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6d50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6d60: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6d70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6d80: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
6d90: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
6da0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
6db0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6dc0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
6dd0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
6de0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
6df0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
6e00: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
6e10: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6e20: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6e30: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6e40: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6e50: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6e60: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6e70: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6e80: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6e90: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6ea0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6eb0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6ec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ed0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
6ee0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
6ef0: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
6f00: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6f10: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
6f20: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6f30: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6f40: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6f50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6f60: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6f70: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6f80: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
6f90: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6fa0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
6fb0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6fc0: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
6fd0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
6fe0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6ff0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7000: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7010: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
7020: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7030: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
7040: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7050: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
7060: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
7070: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
7080: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
7090: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
70a0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
70b0: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
70c0: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
70d0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
70e0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
70f0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
7100: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
7110: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
7120: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
7130: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
7140: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
7150: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
7160: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
7170: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
7180: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7190: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
71a0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
71b0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
71c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
71d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
71e0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
71f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
7210: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
7220: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7230: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
7240: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
7250: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
7260: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7270: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
7280: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
7290: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
72a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
72b0: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
72c0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
72d0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
72e0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
72f0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
7300: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
7310: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
7320: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
7330: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
7340: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
7350: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
7360: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
7370: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
7380: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
7390: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
73a0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
73b0: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
73c0: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
73d0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
73e0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
73f0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
7400: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
7410: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
7420: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
7430: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
7440: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
7450: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
7460: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
7470: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
7480: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
7490: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
74a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
74b0: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
74c0: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
74d0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
74e0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
74f0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
7500: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
7510: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
7520: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
7530: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
7540: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
7550: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
7560: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
7570: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
7580: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
7590: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
75a0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
75b0: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
75c0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
75d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
75e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
75f0: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
7600: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
7610: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
7620: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
7630: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
7640: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
7650: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
7660: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
7670: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
7680: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
7690: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
76a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
76b0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
76c0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
76d0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
76e0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
76f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
7700: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
7710: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
7720: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
7730: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
7740: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
7750: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7760: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
7770: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7780: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
7790: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
77a0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
77b0: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
77c0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
77d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
77e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
77f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
7800: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
7810: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
7820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7830: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7840: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7850: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
7860: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7870: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
7880: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
7890: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
78a0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
78b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
78c0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
78d0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
78e0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
78f0: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
7900: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
7910: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
7920: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7930: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7940: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7950: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
7960: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
7970: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
7980: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
7990: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
79a0: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
79b0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
79c0: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
79d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
79e0: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
79f0: 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  s the sqlite3Pag
7a00: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a  erStmtCommit().*
7a10: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
7a20: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
7a30: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
7a40: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
7a50: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
7a60: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
7a70: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
7a80: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
7a90: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
7aa0: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
7ab0: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7ac0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7ad0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7ae0: 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79 20  er;.  PgHistory 
7af0: 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
7b00: 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
7b10: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  er);.  assert( M
7b20: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70  EMDB );.  if( !p
7b30: 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a  Hist->inStmt ){.
7b40: 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
7b50: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  t->pPrevStmt==0 
7b60: 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  && pHist->pNextS
7b70: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  tmt==0 );.    if
7b80: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7b90: 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f 54  ){.      PGHDR_T
7ba0: 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e 70  O_HIST(pPager->p
7bb0: 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e 70  Stmt, pPager)->p
7bc0: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a  PrevStmt = pPg;.
7bd0: 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74 2d      }.    pHist-
7be0: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
7bf0: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  ger->pStmt;.    
7c00: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
7c10: 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e  pPg;.    pHist->
7c20: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a  inStmt = 1;.  }.
7c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7c40: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
7c50: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
7c60: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
7c70: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7c80: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
7c90: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
7ca0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
7cb0: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
7cc0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
7cd0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7ce0: 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20  PgHdr *p;.  if( 
7cf0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30  pPager->aHash==0
7d00: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
7d10: 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
7d20: 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  [pgno & (pPager-
7d30: 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68  >nHash-1)];.  wh
7d40: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
7d50: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
7d60: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
7d70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
7d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
7d90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7da0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
7db0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
7dc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7dd0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
7de0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
7df0: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
7e00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
7e10: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7e20: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7e30: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
7e40: 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49  ze = -1;.      I
7e50: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
7e60: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
7e70: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7e80: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
7e90: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  UNLOCK;.    pPag
7ea0: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
7eb0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  one = 0;.  }.}..
7ec0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
7ed0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
7ee0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
7ef0: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
7f00: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
7f10: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20  file. This is a 
7f20: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
7f30: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
7f40: 6e 74 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72  ntered.** the er
7f50: 72 6f 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74  ror-state..*/.st
7f60: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
7f70: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
7f80: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
7f90: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72  ( p->errCode ) r
7fa0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
7fb0: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
7fc0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e  _RESERVED || p->
7fd0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
7fe0: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65  ;.  if( p->state
7ff0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
8000: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
8010: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
8020: 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
8030: 6f 63 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ock(p);.  assert
8040: 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ( p->errCode || 
8050: 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  !p->journalOpen 
8060: 7c 7c 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65  || (p->exclusive
8070: 4d 6f 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61  Mode&&!p->journa
8080: 6c 4f 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  lOff) );.  asser
8090: 74 28 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  t( p->errCode ||
80a0: 20 21 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c   !p->stmtOpen ||
80b0: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
80c0: 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  e );.}.../*.** C
80d0: 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  lear the in-memo
80e0: 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  ry cache.  This 
80f0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20  routine.** sets 
8100: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
8110: 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77   pager back to w
8120: 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20  hat it was when 
8130: 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20  it was first.** 
8140: 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74  opened.  Any out
8150: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
8160: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61  re invalidated a
8170: 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74  nd subsequent at
8180: 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63  tempts.** to acc
8190: 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20  ess those pages 
81a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75  will likely resu
81b0: 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
81c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
81d0: 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67   pager_reset(Pag
81e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
81f0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
8200: 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  t;.  if( pPager-
8210: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
8220: 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  n;.  for(pPg=pPa
8230: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8240: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
8250: 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
8260: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
8270: 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
8280: 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
8290: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
82a0: 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
82b0: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
82c0: 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74  xtAll;.    sqlit
82d0: 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  eFree(pPg);.  }.
82e0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
82f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8300: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
8310: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
8320: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
8330: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
8340: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
8350: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
8360: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  = 0;.  sqliteFre
8370: 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
8380: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
8390: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
83a0: 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50  >aHash = 0;.  pP
83b0: 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  ager->nRef = 0;.
83c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
83d0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
83e0: 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61  nsaction.  A tra
83f0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
8400: 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61  d by either.** a
8410: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
8420: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LBACK..**.** Whe
8430: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
8440: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
8450: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
8460: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
8470: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
8480: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
8490: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
84a0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
84b0: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a   will release.**
84c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
84d0: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
84e0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
84f0: 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68   its place if th
8500: 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70  at is.** the app
8510: 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74  ropriate thing t
8520: 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c  o do.  Release l
8530: 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20  ocks usually is 
8540: 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20  appropriate,.** 
8550: 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e  unless we are in
8560: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
8570: 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73  s mode or unless
8580: 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43   this is a .** C
8590: 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20  OMMIT AND BEGIN 
85a0: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20  or ROLLBACK AND 
85b0: 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e  BEGIN operation.
85c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
85d0: 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65  al file is eithe
85e0: 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75  r deleted or tru
85f0: 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  ncated..**.** TO
8600: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
8610: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
8620: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
8630: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
8640: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
8650: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
8660: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
8670: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
8680: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
8690: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
86a0: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
86b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
86c0: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
86d0: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
86e0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
86f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8700: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
8710: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8720: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
8730: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8740: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
8750: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
8760: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8770: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
8780: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
8790: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
87a0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
87b0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
87c0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
87d0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
87e0: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
87f0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
8810: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
8820: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
8830: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8840: 6f 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26  ode .          &
8850: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
8860: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
8870: 2d 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49  ->jfd, 0))==SQLI
8880: 54 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20  TE_OK ){;.      
8890: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
88a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
88b0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
88c0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
88d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
88e0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
88f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8900: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
8910: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
8920: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8930: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
8940: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8950: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
8970: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
8980: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  urnal);.      }.
8990: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
89a0: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
89b0: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
89c0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
89d0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
89e0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
89f0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
8a00: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
8a10: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
8a20: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
8a30: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
8a40: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
8a50: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61   0;.      pPg->a
8a60: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
8a70: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
8a80: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
8a90: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
8aa0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
8ab0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
8ac0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
8ad0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
8ae0: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
8af0: 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  che = 0;.    pPa
8b00: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
8b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
8b20: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
8b30: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
8b40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8b50: 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
8b60: 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  | pPager->useJou
8b70: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
8b80: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
8b90: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
8ba0: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
8bb0: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
8bc0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
8bd0: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
8be0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
8bf0: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
8c00: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8c10: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
8c20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8c30: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
8c40: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
8c50: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
8c60: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
8c70: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
8c80: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
8c90: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8ca0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
8cb0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
8cc0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
8cd0: 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28   -1;..  return (
8ce0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
8cf0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
8d00: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
8d10: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
8d20: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
8d30: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
8d40: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
8d50: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
8d60: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
8d70: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
8d80: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
8d90: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
8da0: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
8db0: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
8dc0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
8dd0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
8de0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
8df0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
8e00: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
8e10: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
8e20: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
8e30: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
8e40: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
8e50: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
8e60: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
8e70: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
8e80: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
8e90: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
8ea0: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
8eb0: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
8ec0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
8ed0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
8ee0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
8ef0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
8f00: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
8f10: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
8f20: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
8f30: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
8f40: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8f50: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
8f60: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
8f70: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
8f80: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
8f90: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
8fa0: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
8fb0: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
8fc0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
8fd0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
8fe0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
8ff0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
9000: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
9010: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
9020: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
9030: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
9040: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
9050: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
9060: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
9070: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
9080: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
9090: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
90a0: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
90b0: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
90c0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
90d0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
90e0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
90f0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
9100: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
9110: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
9120: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
9130: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
9140: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
9150: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
9160: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
9170: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
9180: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
9190: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
91a0: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
91b0: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
91c0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
91d0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
91e0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
91f0: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
9200: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
9210: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
9220: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
9230: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
9240: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
9250: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
9260: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
9270: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
9280: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
9290: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
92a0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
92b0: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
92c0: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
92d0: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
92e0: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
92f0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
9300: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
9310: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
9320: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
9330: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
9340: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
9350: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
9360: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
9370: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
9380: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
9390: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
93a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
93b0: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
93c0: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
93d0: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
93f0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
9400: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
9410: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
9420: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
9430: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
9440: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
9450: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
9460: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75    u8 *aData = (u
9470: 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
9480: 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70  Space;   /* Temp
9490: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70   storage for a p
94a0: 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65  age */..  /* use
94b0: 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20  Cksum should be 
94c0: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
94d0: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
94e0: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
94f0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
9500: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
9510: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
9520: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9530: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65  ert( jfd == (use
9540: 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e  Cksum ? pPager->
9550: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74  jfd : pPager->st
9560: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
9570: 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20   aData );..  rc 
9580: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
9590: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
95a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
95b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
95c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
95d0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
95e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
95f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9600: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9610: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9620: 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
9630: 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20  pageSize + 4;.. 
9640: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
9650: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
9660: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
9670: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
9680: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
9690: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
96a0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
96b0: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
96c0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
96d0: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
96e0: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
96f0: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
9700: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9710: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
9720: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
9730: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
9740: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
9750: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
9760: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
9770: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
9780: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
9790: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
97a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
97b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
97c0: 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29   pgno>(unsigned)
97d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
97e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
97f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
9800: 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20  ( useCksum ){.  
9810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9820: 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a  s(jfd, &cksum);.
9830: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9840: 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
9850: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9860: 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67  = 4;.    if( pag
9870: 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
9880: 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
9890: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
98a0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
98b0: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
98c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
98d0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
98e0: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
98f0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9900: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9910: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
9920: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
9930: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
9940: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
9950: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
9960: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
9970: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
9980: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
9990: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
99a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
99b0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
99c0: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
99d0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
99e0: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
99f0: 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
9a00: 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
9a10: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
9a20: 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
9a30: 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
9a40: 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
9a50: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
9a60: 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
9a70: 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
9a80: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
9a90: 68 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  he..  **.  ** If
9aa0: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
9ab0: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
9ac0: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
9ad0: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
9ae0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
9af0: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
9b00: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
9b10: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
9b20: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
9b30: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
9b40: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
9b50: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
9b60: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
9b70: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
9b80: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
9b90: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
9ba0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
9bb0: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
9bc0: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
9bd0: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
9be0: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
9bf0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
9c00: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
9c10: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
9c20: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
9c30: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
9c40: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
9c50: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
9c60: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
9c70: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
9c80: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
9c90: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
9ca0: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
9cb0: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
9cc0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  in the main roll
9cd0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
9ce0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69  l.  Otherwise, i
9cf0: 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43  f a full ROLLBAC
9d00: 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74  K occurs after t
9d10: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  he statement.  *
9d20: 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66  * rollback the f
9d30: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c  ull ROLLBACK wil
9d40: 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68  l not restore th
9d50: 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72  e page to its or
9d60: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74  iginal.  ** cont
9d70: 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  ent.  Two condit
9d80: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74  ions must be met
9d90: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
9da0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
9db0: 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20    ** files. (1) 
9dc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
9dd0: 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32  t be locked.  (2
9de0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
9df0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
9e00: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
9e10: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
9e20: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
9e30: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
9e40: 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68  not in.  ** cach
9e50: 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20  e or else it is 
9e60: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
9e70: 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50  nc==0..  */.  pP
9e80: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
9e90: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
9ea0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9eb0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9ec0: 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21  XCLUSIVE || pPg!
9ed0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  =0 || pPager->no
9ee0: 53 79 6e 63 20 29 3b 0a 20 20 50 41 47 45 52 54  Sync );.  PAGERT
9ef0: 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20  RACE3("PLAYBACK 
9f00: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
9f10: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
9f20: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
9f30: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9f40: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
9f50: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
9f60: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
9f70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9f80: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
9f90: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
9fa0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9fb0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9fc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9fd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9fe0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
9ff0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
a000: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a010: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  }.    if( pPg ){
a020: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
a030: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
a040: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
a050: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
a060: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
a070: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
a080: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
a090: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
a0a0: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
a0b0: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
a0c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
a0d0: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
a0e0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
a0f0: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
a100: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
a110: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
a120: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
a130: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
a140: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
a150: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
a160: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
a170: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
a180: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
a190: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
a1a0: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
a1b0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
a1c0: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
a1d0: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
a1e0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
a1f0: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
a200: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
a210: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a220: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
a230: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
a240: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
a250: 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72  iter(pPg, pPager
a260: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a270: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
a280: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
a290: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
a2a0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
a2b0: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
a2c0: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
a2d0: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
a2e0: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
a2f0: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
a300: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
a310: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
a320: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
a330: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
a340: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
a350: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
a360: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
a370: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
a380: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
a390: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
a3a0: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
a3b0: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
a3c0: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
a3d0: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
a3e0: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d  g->pgno, 3);.  }
a3f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a400: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
a410: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
a420: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
a430: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
a440: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
a450: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
a460: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
a470: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a480: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
a490: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
a4a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
a4b0: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
a4c0: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
a4d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a4e0: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
a4f0: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
a500: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a510: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
a520: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
a530: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
a540: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
a550: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
a560: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
a570: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
a580: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
a590: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
a5a0: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
a5b0: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
a5c0: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
a5d0: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
a5e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
a5f0: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
a600: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
a610: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
a620: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
a630: 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61  master(const cha
a640: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
a650: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
a660: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
a670: 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d  OsFile *master =
a680: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   0;.  char *zMas
a690: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
a6a0: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
a6b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a6c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
a6d0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
a6e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
a6f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a700: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
a710: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a720: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
a730: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
a740: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
a750: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
a760: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
a770: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
a780: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
a790: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72  erence..  */.  r
a7a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
a7b0: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
a7c0: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 61  r, &master);.  a
a7d0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a7e0: 45 5f 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20 29  E_OK || master )
a7f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
a800: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
a810: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61  master_out;.  ma
a820: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20  ster_open = 1;. 
a830: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
a840: 69 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20  ileSize(master, 
a850: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
a860: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
a870: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
a880: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
a890: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
a8a0: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
a8b0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
a8c0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
a8d0: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  = 0;..    /* Loa
a8e0: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
a8f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a900: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
a910: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
a920: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a930: 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
a940: 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
a950: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  . .    */.    zM
a960: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28  asterJournal = (
a970: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
a980: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
a990: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  al);.    if( !zM
a9a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
a9b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a9c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
a9d0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a9e0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
a9f0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
aa00: 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  master, zMasterJ
aa10: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
aa20: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
aa30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
aa40: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
aa50: 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e  out;..    zJourn
aa60: 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
aa70: 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  nal;.    while( 
aa80: 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65  (zJournal-zMaste
aa90: 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65  rJournal)<nMaste
aaa0: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
aab0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
aac0: 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e  ileExists(zJourn
aad0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  al) ){.        /
aae0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
aaf0: 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
ab00: 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
ab10: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
ab20: 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69         ** Open i
ab30: 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
ab40: 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
ab50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
ab60: 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  If.        ** so
ab70: 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
ab80: 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
ab90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
aba0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
abb0: 20 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f        OsFile *jo
abc0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
abd0: 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20     int c;..     
abe0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
abf0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a  sOpenReadOnly(zJ
ac00: 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c  ournal, &journal
ac10: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
ac20: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
ac30: 20 7c 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20   || journal );. 
ac40: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
ac50: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ac60: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
ac70: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
ac80: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
ac90: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
aca0: 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d  nal(journal, &zM
acb0: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
acc0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
acd0: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
ace0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
acf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ad00: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ad10: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ad20: 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  }..        c = z
ad30: 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20  MasterPtr!=0 && 
ad40: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
ad50: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
ad60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
ad70: 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a  ee(zMasterPtr);.
ad80: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
ad90: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
ada0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
adb0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
adc0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
add0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
ade0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
adf0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
ae00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
ae10: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
ae20: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
ae30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
ae40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
ae50: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
ae60: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
ae70: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
ae80: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
ae90: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
aea0: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
aeb0: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
aec0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
aed0: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
aee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
aef0: 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }...static void 
af00: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
af10: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
af20: 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  er);../*.** Trun
af30: 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69  cate the main fi
af40: 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  le of the given 
af50: 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d  pager to the num
af60: 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
af70: 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20  indicated. Also 
af80: 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
af90: 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74 69  hed representati
afa0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  on of the file..
afb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
afc0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
afd0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
afe0: 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
aff0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b000: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( 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 7b 0a 20 20 20 20 72 63 20 3d 20 73  VE ){.    rc = 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 20 20 7d 0a 20  64)nPage);.  }. 
b070: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b080: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
b090: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
b0a0: 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e  ;.    pager_trun
b0b0: 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
b0c0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
b0d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
b0e0: 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65  t the sectorSize
b0f0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
b100: 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ager..**.** The 
b110: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74  sector size is t
b120: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65  he larger of the
b130: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70   sector size rep
b140: 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  orted.** by sqli
b150: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
b160: 29 20 61 6e 64 20 74 68 65 20 70 61 67 65 53 69  ) and the pageSi
b170: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ze..*/.static vo
b180: 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
b190: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b1a0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  .  pPager->secto
b1b0: 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
b1c0: 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
b1d0: 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 70  er->fd);.  if( p
b1e0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
b1f0: 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e<pPager->pageSi
b200: 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ze ){.    pPager
b210: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70  ->sectorSize = p
b220: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
b230: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
b240: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
b250: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
b260: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
b270: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
b280: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
b290: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
b2a0: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
b2b0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
b2c0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
b2d0: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
b2e0: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
b2f0: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
b300: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
b310: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
b320: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
b330: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
b340: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b350: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
b360: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
b370: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
b380: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
b390: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
b3a0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
b3b0: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
b3c0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
b3d0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
b3e0: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
b3f0: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
b400: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
b410: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
b420: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
b430: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
b440: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
b450: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
b460: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
b470: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
b480: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
b490: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
b4a0: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
b4b0: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
b4c0: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
b4d0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b4e0: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
b4f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
b500: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
b510: 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
b520: 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
b530: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
b540: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
b550: 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29  ournal.).**  (6)
b560: 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
b570: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b580: 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
b590: 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
b5a0: 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
b5b0: 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
b5c0: 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
b5d0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
b5e0: 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
b5f0: 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
b600: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
b610: 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
b620: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
b630: 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
b640: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
b650: 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
b660: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37  in UTF-8..**  (7
b670: 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
b680: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
b690: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
b6a0: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
b6b0: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
b6c0: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
b6d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b6e0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
b6f0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
b700: 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
b710: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
b720: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b730: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
b740: 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d  the first 6 item
b750: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
b760: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
b770: 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
b780: 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20  ance of the 7th 
b790: 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
b7a0: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
b7b0: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
b7c0: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
b7d0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b7e0: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
b7f0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
b800: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
b810: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
b820: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
b830: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
b840: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
b850: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
b860: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
b870: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
b880: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
b890: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
b8a0: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
b8b0: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
b8c0: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
b8d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b8e0: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
b8f0: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
b900: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
b910: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
b920: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
b930: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
b940: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
b950: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
b960: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
b970: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
b980: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
b990: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
b9a0: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
b9b0: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
b9c0: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
b9d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
b9e0: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
b9f0: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
ba00: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
ba10: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
ba20: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
ba30: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
ba40: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
ba50: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
ba60: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
ba70: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
ba80: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
ba90: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
baa0: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
bab0: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
bac0: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
bad0: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
bae0: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
baf0: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
bb00: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
bb10: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
bb20: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
bb30: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
bb40: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
bb50: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
bb60: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
bb70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
bb80: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
bb90: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
bba0: 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
bbb0: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
bbc0: 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
bbd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
bbe0: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
bbf0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
bc00: 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
bc10: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
bc20: 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
bc30: 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
bc40: 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
bc50: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
bc60: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
bc70: 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
bc80: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
bc90: 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
bca0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
bcb0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
bcc0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
bcd0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
bce0: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
bcf0: 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
bd00: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd20: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
bd30: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
bd40: 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
bd50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
bd70: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
bd80: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  rnal */.  int i;
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
bdb0: 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
bdc0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
bdd0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
bde0: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
bdf0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
be00: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
be10: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
be20: 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
be30: 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
be40: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
be50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
be60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
be70: 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a   if any */..  /*
be80: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
be90: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
bea0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
beb0: 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66    Abort early if
bec0: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
bed0: 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f  l is empty..  */
bee0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bef0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
bf00: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
bf10: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
bf20: 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20  r->jfd, &szJ);. 
bf30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bf40: 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a  OK || szJ==0 ){.
bf50: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
bf60: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
bf70: 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
bf80: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
bf90: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
bfa0: 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
bfb0: 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
bfc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
bfd0: 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
bfe0: 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
bff0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
c000: 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
c010: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
c020: 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
c030: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
c040: 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
c050: 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  k..  */.  rc = r
c060: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
c070: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
c080: 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72  Master);.  asser
c090: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
c0a0: 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  NE );.  if( rc!=
c0b0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d  SQLITE_OK || (zM
c0c0: 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65  aster && !sqlite
c0d0: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d  3OsFileExists(zM
c0e0: 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73  aster)) ){.    s
c0f0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
c100: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
c110: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  = 0;.    if( rc=
c120: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
c130: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c140: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
c150: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  back;.  }.  sqli
c160: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
c170: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61  ->jfd, 0);.  pPa
c180: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c190: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
c1a0: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
c1b0: 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
c1c0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
c1d0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20   call returns.  
c1e0: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ** SQLITE_DONE o
c1f0: 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  r an IO error oc
c200: 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  curs. */.  while
c210: 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52  ( 1 ){..    /* R
c220: 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
c230: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
c240: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c250: 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
c260: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
c270: 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
c280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c290: 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
c2a0: 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
c2b0: 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
c2c0: 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
c2d0: 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
c2e0: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
c2f0: 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
c300: 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
c310: 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
c320: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
c330: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
c340: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
c350: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
c360: 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
c370: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c380: 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
c390: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
c3a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
c3b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c3c0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
c3d0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
c3e0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
c3f0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
c400: 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
c410: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
c420: 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
c430: 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
c440: 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
c450: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
c460: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
c470: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
c480: 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
c490: 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
c4a0: 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
c4b0: 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
c4c0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
c4d0: 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
c4e0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
c4f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
c500: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
c510: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c520: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c530: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
c540: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
c550: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
c560: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
c570: 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
c580: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
c590: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c5a0: 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
c5b0: 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
c5c0: 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
c5d0: 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
c5e0: 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
c5f0: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
c600: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
c610: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
c620: 73 69 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20  sists of.    ** 
c630: 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65  journalled copie
c640: 73 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  s of pages that 
c650: 6e 65 65 64 20 74 6f 20 62 65 20 72 65 61 64 20  need to be read 
c660: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61  back into the ca
c670: 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  che..    */.    
c680: 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
c690: 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e  isHot ){.      n
c6a0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
c6b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
c6c0: 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
c6d0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
c6e0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
c6f0: 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
c700: 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
c710: 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
c720: 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
c730: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
c740: 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e  k to it's origin
c750: 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
c760: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
c770: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
c780: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c790: 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
c7a0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
c7b0: 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
c7c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c7d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c7e0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
c7f0: 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
c800: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
c810: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
c820: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
c830: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
c840: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c850: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
c860: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
c870: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
c880: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
c890: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
c8a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
c8b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
c8c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c8d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c8e0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
c8f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c900: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
c910: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c920: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
c930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c950: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
c960: 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
c970: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c980: 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
c990: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
c9a0: 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
c9b0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
c9c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
c9d0: 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
c9e0: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
c9f0: 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65    }.  if( zMaste
ca00: 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  r ){.    /* If t
ca10: 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
ca20: 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
ca30: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
ca40: 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
ca50: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
ca60: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
ca70: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
ca80: 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
ca90: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
caa0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
cab0: 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
cac0: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
cad0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
cae0: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
caf0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
cb00: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
cb10: 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
cb20: 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
cb30: 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
cb40: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
cb50: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
cb60: 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
cb70: 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
cb80: 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
cb90: 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
cba0: 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
cbb0: 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
cbc0: 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
cbd0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
cbe0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cbf0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74   Playback the st
cc00: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
cc10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73  .**.** This is s
cc20: 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e  imilar to playin
cc30: 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  g back the trans
cc40: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
cc50: 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77  ut with.** a few
cc60: 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a   extra twists..*
cc70: 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
cc80: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
cc90: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
cca0: 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61   file at the sta
ccb0: 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  rt of.**        
ccc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
ccd0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  s stored in pPag
cce0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f  er->stmtSize, no
ccf0: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
cd00: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
cd10: 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20   itself..**.**  
cd20: 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69    (2)  In additi
cd30: 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  on to playing ba
cd40: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
cd50: 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a   journal, also.*
cd60: 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61  *         playba
cd70: 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20  ck all pages of 
cd80: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
cd90: 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e  journal beginnin
cda0: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20  g.**         at 
cdb0: 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73  offset pPager->s
cdc0: 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  tmtJSize..*/.sta
cdd0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74  tic int pager_st
cde0: 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  mt_playback(Page
cdf0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
ce00: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
ce10: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ce20: 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e  f the full journ
ce30: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f  al */.  i64 hdrO
ce40: 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20  ff;.  int nRec; 
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
ce70: 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  rds */.  int i; 
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
cea0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  r */.  int rc;..
ceb0: 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
cec0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e  journalOff;.#ifn
ced0: 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a  def NDEBUG .  {.
cee0: 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a      i64 os_szJ;.
cef0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cf00: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
cf10: 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29  r->jfd, &os_szJ)
cf20: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
cf30: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
cf40: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
cf50: 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a   szJ==os_szJ );.
cf60: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
cf70: 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
cf80: 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73  e the offset jus
cf90: 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  t after the end 
cfa0: 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  of the last jour
cfb0: 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72  nal.  ** page wr
cfc0: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65  itten before the
cfd0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
cfe0: 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73  eader for this s
cff0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
d000: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72  ansaction was wr
d010: 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e  itten, or the en
d020: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
d030: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
d040: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
d050: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
d060: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
d070: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
d080: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
d090: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
d0a0: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
d0b0: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
d0c0: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
d0d0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
d0e0: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
d0f0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
d100: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
d110: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
d120: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
d130: 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
d140: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
d150: 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
d160: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
d170: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
d180: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
d190: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
d1a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d1b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
d1c0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
d1d0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71  rnalOpen );.  sq
d1e0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
d1f0: 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
d200: 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
d210: 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
d220: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
d230: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
d240: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
d250: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
d260: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d270: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
d280: 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
d290: 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
d2a0: 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
d2b0: 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
d2c0: 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
d2d0: 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
d2e0: 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
d2f0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
d300: 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
d310: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
d320: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63  =0; i--){.    rc
d330: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d340: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d350: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
d360: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
d370: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
d380: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
d390: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d3a0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d3b0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
d3c0: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
d3d0: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
d3e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
d3f0: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
d400: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
d410: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
d420: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
d430: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
d440: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
d450: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
d460: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
d470: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
d480: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
d490: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d4a0: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
d4b0: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
d4c0: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
d4d0: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
d4e0: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
d4f0: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
d500: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
d510: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
d520: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
d530: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
d540: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
d550: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
d560: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
d570: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
d580: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
d590: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d5a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
d5b0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d5c0: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
d5d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d5e0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
d5f0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73  e;.  pPager->cks
d600: 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d  umInit = pPager-
d610: 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68  >stmtCksum;.  wh
d620: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
d630: 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66  rnalOff < hdrOff
d640: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
d650: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
d660: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
d670: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
d680: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d690: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d6a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d6b0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
d6c0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
d6d0: 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ..  while( pPage
d6e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d6f0: 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  szJ ){.    u32 n
d700: 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  JRec;         /*
d710: 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e   Number of Journ
d720: 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al Records */.  
d730: 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
d740: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
d750: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
d760: 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
d770: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d780: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d790: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
d7a0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
d7b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
d7c0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
d7d0: 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
d7e0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63  0 ){.      nJRec
d7f0: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
d800: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
d810: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
d820: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
d830: 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69  for(i=nJRec-1; i
d840: 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  >=0 && pPager->j
d850: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b  ournalOff < szJ;
d860: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20   i--){.      rc 
d870: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
d880: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
d890: 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31  , pPager->jfd, 1
d8a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d8b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
d8c0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
d8d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
d8e0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
d8f0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  back;.    }.  }.
d900: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
d910: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a  alOff = szJ;.  .
d920: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d930: 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  k:.  if( rc==SQL
d940: 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50  ITE_OK) {.    pP
d950: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d960: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70   = szJ;.    /* p
d970: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
d980: 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  e(pPager); */.  
d990: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
d9a0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
d9b0: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
d9c0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
d9d0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
d9e0: 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
d9f0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
da00: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
da10: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
da20: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
da30: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
da40: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
da50: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
da60: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
da70: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
da80: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
da90: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
daa0: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
dab0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
dac0: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
dad0: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
dae0: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
daf0: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
db00: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
db10: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
db20: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
db30: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
db40: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
db50: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
db60: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
db70: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
db80: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
db90: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
dba0: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
dbb0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
dbc0: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
dbd0: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
dbe0: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
dbf0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
dc00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dc10: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
dc20: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
dc30: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
dc40: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
dc50: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
dc60: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
dc70: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
dc80: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
dc90: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
dca0: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
dcb0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
dcc0: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
dcd0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
dce0: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
dcf0: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
dd00: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
dd10: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
dd20: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
dd30: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
dd40: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
dd50: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
dd60: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
dd70: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
dd80: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
dd90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
dda0: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
ddb0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
ddc0: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
ddd0: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
dde0: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
ddf0: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
de00: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
de10: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
de30: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
de40: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
de50: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
de60: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
de70: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
de80: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
de90: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
dea0: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
deb0: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
dec0: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
ded0: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
dee0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
def0: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
df00: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
df10: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
df20: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
df30: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
df40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
df50: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
df60: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
df70: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
df80: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
df90: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
dfa0: 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
dfb0: 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
dfc0: 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
dfd0: 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
dfe0: 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b  int full_fsync){
dff0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
e000: 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c  c =  level==1 ||
e010: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
e020: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
e030: 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33  lSync = level==3
e040: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
e050: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
e060: 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75  >full_fsync = fu
e070: 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20  ll_fsync;.  if( 
e080: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
e090: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
e0a0: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
e0b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
e0c0: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
e0d0: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
e0e0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
e0f0: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
e100: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
e110: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
e120: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
e130: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
e140: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
e150: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
e160: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
e170: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
e180: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
e190: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
e1a0: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
e1b0: 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  y file. .**.** W
e1c0: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
e1d0: 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66  scriptor into *f
e1e0: 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
e1f0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
e200: 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  or some.** other
e210: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
e220: 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  e fail..**.** Th
e230: 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
e240: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
e250: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
e260: 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20  e when it is.** 
e270: 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
e280: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  c int sqlite3Pag
e290: 65 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c  erOpentemp(OsFil
e2a0: 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  e **pFd){.  int 
e2b0: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
e2c0: 63 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b  c;.  char zFile[
e2d0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
e2e0: 53 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53  SIZE];..#ifdef S
e2f0: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
e300: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
e310: 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
e320: 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
e330: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
e340: 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20  .#endif.  do{.  
e350: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
e360: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
e370: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
e380: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e390: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
e3a0: 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61  , pFd, 1);.    a
e3b0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e3c0: 45 5f 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a  E_OK || *pFd );.
e3d0: 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20    }while( cnt>0 
e3e0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
e3f0: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
e400: 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e  OMEM );.  return
e410: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
e420: 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
e430: 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20  cache and put a 
e440: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
e450: 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70  age cache in *pp
e460: 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69  Pager..** The fi
e470: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  le to be cached 
e480: 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20  need not exist. 
e490: 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   The file is not
e4a0: 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a   locked until.**
e4b0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
e4c0: 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  to sqlite3PagerG
e4d0: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
e4e0: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
e4f0: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
e500: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
e510: 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
e520: 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  Unref()..**.** I
e530: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
e540: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
e550: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
e560: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
e570: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
e580: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
e590: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
e5a0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
e5b0: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
e5c0: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
e5d0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
e5e0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
e5f0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
e600: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
e610: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
e620: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
e630: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
e640: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
e650: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
e660: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
e670: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
e680: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e690: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
e6a0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
e6b0: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
e6c0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
e6d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e6e0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
e6f0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
e700: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
e710: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
e720: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
e730: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
e740: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
e750: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
e760: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
e770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
e780: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
e790: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
e7a0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e7b0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
e7c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
e7d0: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20  .  int nameLen; 
e7e0: 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20   /* Compiler is 
e7f0: 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61  wrong. This is a
e800: 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
e810: 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a  d before use */.
e820: 20 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30    OsFile *fd = 0
e830: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e840: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
e850: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
e860: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
e870: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
e880: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
e890: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
e8a0: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
e8b0: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
e8c0: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
e8d0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
e8e0: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
e8f0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
e900: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
e910: 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ZE];.#ifdef SQLI
e920: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
e930: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
e940: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
e950: 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
e960: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
e970: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
e980: 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
e990: 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
e9a0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
e9b0: 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
e9c0: 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
e9d0: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
e9e0: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
e9f0: 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
ea00: 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
ea10: 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
ea20: 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
ea30: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
ea40: 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75  n be set. It wou
ea50: 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73  ld be nice to as
ea60: 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54  sert.  ** that T
ea70: 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
ea80: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75   is non-zero, bu
ea90: 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61  t alas this brea
eaa0: 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20  ks test cases . 
eab0: 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69   ** written to i
eac0: 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20  nvoke the pager 
ead0: 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  directly..  */. 
eae0: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
eaf0: 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
eb00: 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
eb10: 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69  t( pTsd );.#endi
eb20: 66 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20  f..  /* We used 
eb30: 74 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f  to test if mallo
eb40: 63 28 29 20 68 61 64 20 61 6c 72 65 61 64 79 20  c() had already 
eb50: 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72  failed before pr
eb60: 6f 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20  oceeding. .  ** 
eb70: 42 75 74 20 74 68 65 20 77 61 79 20 74 68 69 73  But the way this
eb80: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
eb90: 64 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e  d in SQLite mean
eba0: 73 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72  s that can never
ebb0: 0a 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75  .  ** happen. Fu
ebc0: 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68  rthermore, if th
ebd0: 65 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  e malloc-failed 
ebe0: 66 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79 20  flag is already 
ebf0: 73 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65  set, .  ** eithe
ec00: 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  r the call to sq
ec10: 6c 69 74 65 53 74 72 44 75 70 28 29 20 6f 72 20  liteStrDup() or 
ec20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62  sqliteMalloc() b
ec30: 65 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66  elow will.  ** f
ec40: 61 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20  ail shortly and 
ec50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74  SQLITE_NOMEM ret
ec60: 75 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20  urned anyway..  
ec70: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
ec80: 30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  0;..  /* Open th
ec90: 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64  e pager file and
eca0: 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61   set zFullPathna
ecb0: 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d  me to point at m
ecc0: 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20  alloc()ed .  ** 
ecd0: 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  memory containin
ece0: 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66  g the complete f
ecf0: 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e  ilename (i.e. in
ed00: 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65  cluding the dire
ed10: 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69  ctory)..  */.  i
ed20: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
ed30: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
ed40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ed50: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
ed60: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
ed70: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
ed80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
ed90: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
eda0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
edb0: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
edc0: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
edd0: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46  f.    {.      zF
ede0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
edf0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
ee00: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
ee10: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50        if( zFullP
ee20: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
ee30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ee40: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
ee50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
ee60: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
ee70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
ee80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
ee90: 66 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  fd );.      }.  
eea0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
eeb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
eec0: 65 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b  erOpentemp(&fd);
eed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
eee0: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70  mpFileName(zTemp
eef0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
ef00: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
ef10: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
ef20: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
ef30: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
ef40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ef50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74  TE_OK ){.      t
ef60: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
ef70: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
ef80: 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20  ocate the Pager 
ef90: 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61  structure. As pa
efa0: 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61  rt of the same a
efb0: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63  llocation, alloc
efc0: 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66  ate.  ** space f
efd0: 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  or the full path
efe0: 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64  s of the file, d
eff0: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75  irectory and jou
f000: 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65  rnal .  ** (Page
f010: 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67  r.zFilename, Pag
f020: 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e  er.zDirectory an
f030: 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
f040: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  )..  */.  if( zF
f050: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
f060: 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72     nameLen = str
f070: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
f080: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
f090: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
f0a0: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
f0b0: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
f0c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
f0d0: 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
f0e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
f0f0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
f100: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
f110: 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44  llocRaw(SQLITE_D
f120: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
f130: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20  );.    }.  }... 
f140: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
f150: 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
f160: 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
f170: 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
f180: 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69  memory .  ** poi
f190: 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c  nted to by zFull
f1a0: 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74  Pathname, free t
f1b0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
f1c0: 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
f1d0: 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e   .  ** file. Sin
f1e0: 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
f1f0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
f200: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
f210: 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
f220: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
f230: 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
f240: 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
f250: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c  zFullPathname ||
f260: 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
f270: 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  ace || rc!=SQLIT
f280: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
f290: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
f2a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f2b0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f2c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
f2d0: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
f2e0: 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f  rn ((rc==SQLITE_
f2f0: 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  OK)?SQLITE_NOMEM
f300: 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  :rc);.  }..  PAG
f310: 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25  ERTRACE3("OPEN %
f320: 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
f330: 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c  DLEID(fd), zFull
f340: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54  Pathname);.  IOT
f350: 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
f360: 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46  s\n", pPager, zF
f370: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20  ullPathname)).  
f380: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
f390: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67  e = (char*)&pPag
f3a0: 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  er[1];.  pPager-
f3b0: 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
f3c0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f3d0: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70  [nameLen+1];.  p
f3e0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
f3f0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
f400: 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ctory[nameLen+1]
f410: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  ;.  memcpy(pPage
f420: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46  r->zFilename, zF
f430: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d  ullPathname, nam
f440: 65 4c 65 6e 2b 31 29 3b 0a 20 20 6d 65 6d 63 70  eLen+1);.  memcp
f450: 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
f460: 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  tory, zFullPathn
f470: 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b  ame, nameLen+1);
f480: 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65  ..  for(i=nameLe
f490: 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  n; i>0 && pPager
f4a0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
f4b0: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
f4c0: 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
f4d0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
f4e0: 31 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70 79  1] = 0;.  memcpy
f4f0: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
f500: 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  l, zFullPathname
f510: 2c 6e 61 6d 65 4c 65 6e 29 3b 0a 20 20 73 71 6c  ,nameLen);.  sql
f520: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
f530: 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79  hname);.  memcpy
f540: 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
f550: 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a  al[nameLen], "-j
f560: 6f 75 72 6e 61 6c 22 2c 73 69 7a 65 6f 66 28 22  ournal",sizeof("
f570: 2d 6a 6f 75 72 6e 61 6c 22 29 29 3b 0a 20 20 70  -journal"));.  p
f580: 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  Pager->fd = fd;.
f590: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75    /* pPager->jou
f5a0: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  rnalOpen = 0; */
f5b0: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
f5c0: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
f5d0: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
f5e0: 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
f5f0: 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
f600: 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  && readOnly;.  /
f610: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
f620: 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
f630: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
f640: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f650: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
f660: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
f670: 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
f680: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
f690: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
f6a0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
f6b0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
f6c0: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
f6d0: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
f6e0: 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
f6f0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
f700: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
f710: 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  >mxPage = 100;. 
f720: 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
f730: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
f740: 45 5f 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65 72  E_COUNT;.  asser
f750: 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d  t( PAGER_UNLOCK=
f760: 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  =0 );.  /* pPage
f770: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
f780: 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a  _UNLOCK; */.  /*
f790: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
f7a0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f7b0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
f7c0: 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
f7d0: 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
f7e0: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
f7f0: 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
f800: 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
f810: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
f820: 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
f830: 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
f840: 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
f850: 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
f860: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
f870: 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  = tempFile; .  p
f880: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
f890: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
f8a0: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
f8b0: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
f8c0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
f8d0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
f8e0: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
f8f0: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
f900: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
f910: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
f920: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
f930: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
f940: 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
f950: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
f960: 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
f970: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
f980: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
f990: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
f9a0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
f9b0: 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28  xtra);.  assert(
f9c0: 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66  fd||memDb);.  if
f9d0: 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
f9e0: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
f9f0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ager);.  }.  /* 
fa00: 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
fa10: 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
fa20: 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
fa30: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
fa40: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
fa50: 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
fa60: 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65   = pPager;.#ifde
fa70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
fa80: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
fa90: 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  T.  pPager->pNex
faa0: 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72  t = pTsd->pPager
fab0: 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72  ;.  pTsd->pPager
fac0: 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69   = pPager;.#endi
fad0: 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
fae0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
faf0: 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
fb00: 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
fb10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
fb20: 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
fb30: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fb40: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
fb50: 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
fb60: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
fb70: 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
fb80: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
fb90: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
fba0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
fbb0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
fbc0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
fbd0: 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
fbe0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
fbf0: 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
fc00: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
fc10: 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
fc20: 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
fc30: 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
fc40: 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
fc50: 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
fc60: 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
fc70: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
fc80: 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
fc90: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
fca0: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
fcb0: 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
fcc0: 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
fcd0: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  lled by sqlite3P
fce0: 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a  agerUnref()..*/.
fcf0: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
fd00: 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50  rSetDestructor(P
fd10: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
fd20: 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61  id (*xDesc)(DbPa
fd30: 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
fd40: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
fd50: 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
fd60: 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
fd70: 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
fd80: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
fd90: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
fda0: 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
fdb0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
fdc0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
fdd0: 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
fde0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
fdf0: 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
fe00: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
fe10: 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
fe20: 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
fe30: 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
fe40: 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
fe50: 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
fe60: 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
fe70: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
fe80: 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
fe90: 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
fea0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
feb0: 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
fec0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
fed0: 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69  einit)(DbPage*,i
fee0: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
fef0: 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
ff00: 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
ff10: 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
ff20: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
ff30: 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73   size.  If the s
ff40: 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a  uggest new page.
ff50: 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70  ** size is inapp
ff60: 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
ff70: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
ff80: 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63  ge size is selec
ff90: 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ted.** and retur
ffa0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
ffb0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
ffc0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
ffd0: 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  r, int pageSize)
ffe0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  {.  assert( page
fff0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
10000 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
10010 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
10020 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
10030 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  mDb && pPager->n
10040 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61  Ref==0 ){.    pa
10050 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
10060 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
10070 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
10080 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ze;.    pPager->
10090 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
100a0 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  te3ReallocOrFree
100b0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
100c0 63 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  ce, pageSize);. 
100d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
100e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  er->pageSize;.}.
100f0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
10100 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
10110 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
10120 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
10130 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
10140 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
10150 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
10160 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
10170 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
10180 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
10190 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
101a0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
101b0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
101c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
101d0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
101e0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
101f0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
10200 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
10210 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
10220 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
10230 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
10240 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
10250 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
10260 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
10270 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
10280 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
10290 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
102a0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
102b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
102c0 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
102d0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
102e0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
102f0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
10300 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
10310 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
10320 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
10330 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
10340 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
10350 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
10360 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
10370 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
10380 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
10390 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
103a0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
103b0 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
103c0 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
103d0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
103e0 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
103f0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
10400 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
10410 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
10420 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
10430 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
10440 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
10450 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10460 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
10470 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
10480 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
10490 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
104a0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
104b0 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
104c0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
104d0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
104e0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
104f0 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
10500 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
10510 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
10520 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
10530 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
10540 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10550 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
10560 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
10570 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
10580 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
10590 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
105a0 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
105b0 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
105c0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72  o. .**.** No err
105d0 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  or checking is d
105e0 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  one. The rationa
105f0 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  l for this is th
10600 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
10610 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c   .** may be call
10620 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  ed even if the f
10630 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
10640 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20  st or contain a 
10650 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74  header. In .** t
10660 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74  hese cases sqlit
10670 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20  e3OsRead() will 
10680 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c  return an error,
10690 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f   to which the co
106a0 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e  rrect .** respon
106b0 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68  se is to zero th
106c0 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73  e memory at pDes
106d0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20  t and continue. 
106e0 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72   A real IO error
106f0 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d   .** will presum
10700 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62  ably recur and b
10710 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65  e picked up late
10720 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61  r (Todo: Think a
10730 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69  bout this)..*/.i
10740 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
10750 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
10760 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
10770 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
10780 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
10790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
107a0 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
107b0 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45   0, N);.  if( ME
107c0 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69  MDB==0 ){.    di
107d0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
107e0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
107f0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
10800 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20  Pager->fd, 0);. 
10810 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
10820 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
10830 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
10840 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
10850 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
10860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
10870 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
10880 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69  pDest, N);.    i
10890 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
108a0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
108b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
108c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
108d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
108e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
108f0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
10900 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
10910 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
10920 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
10930 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ger. .**.** If t
10940 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  he PENDING_BYTE 
10950 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
10960 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20   directly after 
10970 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
10980 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e  * file, then con
10990 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20  sider this page 
109a0 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
109b0 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c   too. For exampl
109c0 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47  e, if.** PENDING
109d0 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30  _BYTE is byte 40
109e0 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79  96 (the first by
109f0 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e  te of page 5) an
10a00 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
10a10 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39  e.** file is 409
10a20 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65  6 bytes, 5 is re
10a30 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f  turned instead o
10a40 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 4..*/.int sqli
10a50 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
10a60 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
10a70 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74  {.  i64 n;.  int
10a80 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
10a90 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
10aa0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
10ab0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10ac0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
10ad0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
10ae0 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
10af0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
10b00 73 65 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63  se {.    if( (rc
10b10 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10b20 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
10b30 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
10b40 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
10b50 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
10b60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10b70 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
10b80 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
10b90 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
10ba0 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
10bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
10bc0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10bd0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
10be0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
10bf0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
10c00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
10c10 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a  Size = n;.    }.
10c20 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
10c30 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
10c40 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
10c50 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
10c60 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50  f( n>pPager->mxP
10c70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
10c80 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20  r->mxPgno = n;. 
10c90 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
10ca0 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
10cb0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
10cc0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67  /*.** Clear a Pg
10cd0 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f  History block.*/
10ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
10cf0 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74  arHistory(PgHist
10d00 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73  ory *pHist){.  s
10d10 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
10d20 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74  >pOrig);.  sqlit
10d30 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
10d40 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
10d50 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
10d60 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23  ->pStmt = 0;.}.#
10d70 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65  else.#define cle
10d80 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e  arHistory(x).#en
10d90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
10da0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
10db0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
10dc0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
10dd0 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  ;../*.** Unlink 
10de0 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
10df0 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73  sh chain. Also s
10e00 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  et the page numb
10e10 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  er to 0 to indic
10e20 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ate.** that the 
10e30 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74  page is not part
10e40 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61   of any hash cha
10e50 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  in. This is requ
10e60 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65  ired because the
10e70 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
10e80 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69  Movepage() routi
10e90 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70  ne can leave a p
10ea0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70  age in the .** p
10eb0 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72  NextFree/pPrevFr
10ec0 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  ee list that is 
10ed0 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e  not a part of an
10ee0 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f  y hash-chain..*/
10ef0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
10f00 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67  inkHashChain(Pag
10f10 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
10f20 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
10f30 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
10f40 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
10f50 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20  pNextHash==0 && 
10f60 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  pPg->pPrevHash==
10f70 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
10f80 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
10f90 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
10fa0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
10fb0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
10fc0 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d  ->pPrevHash;.  }
10fd0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
10fe0 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73  vHash ){.    ass
10ff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
11000 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28  sh[pPg->pgno & (
11010 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
11020 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
11030 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
11040 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
11050 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
11060 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
11070 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
11080 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
11090 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
110a0 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
110b0 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  ash;.  }.  if( M
110c0 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61  EMDB ){.    clea
110d0 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
110e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
110f0 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  er));.  }.  pPg-
11100 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67  >pgno = 0;.  pPg
11110 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
11120 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
11130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
11140 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  k a page from th
11150 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65  e free list (the
11160 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
11170 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
11180 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74  ).** and from it
11190 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  s hash collision
111a0 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   chain..*/.stati
111b0 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67  c void unlinkPag
111c0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
111d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
111e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
111f0 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69   /* Keep the pFi
11200 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65  rstSynced pointe
11210 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  r pointing at th
11220 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e  e first synchron
11230 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ized page */.  i
11240 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
11250 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
11260 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
11270 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
11280 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
11290 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
112a0 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
112b0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
112c0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
112d0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
112e0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
112f0 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  st */.  if( pPg-
11300 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
11310 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
11320 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
11330 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11340 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
11350 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
11360 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
11370 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
11380 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
11390 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
113a0 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70  extFree ){.    p
113b0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
113c0 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
113d0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c  pPrevFree;.  }el
113e0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
113f0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70  pPager->pLast==p
11400 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
11410 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
11420 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20  PrevFree;.  }.  
11430 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
11440 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
11450 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  = 0;..  /* Unlin
11460 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
11470 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
11480 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
11490 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
114a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
114b0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
114c0 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
114d0 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
114e0 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
114f0 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
11500 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
11510 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
11520 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
11530 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
11540 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
11550 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
11560 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
11570 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
11580 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
11590 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
115a0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
115b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
115c0 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
115d0 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
115e0 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
115f0 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
11600 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
11610 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
11620 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
11630 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
11640 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
11650 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
11660 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
11670 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
11680 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
11690 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
116a0 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
116b0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
116c0 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
116d0 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
116e0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
116f0 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
11700 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
11710 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
11720 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
11730 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
11740 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
11750 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
11760 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
11770 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
11780 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
11790 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
117a0 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
117b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
117c0 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
117d0 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
117e0 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
117f0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
11800 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
11810 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
11820 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
11830 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
11840 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
11850 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29  er_pgfree_count)
11860 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
11870 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 6d  ge(pPg);.      m
11880 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
11890 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
118a0 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
118b0 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
118c0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
118d0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
118e0 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
118f0 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
11900 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
11910 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
11920 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
11930 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74  ble.  Repeat unt
11940 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
11950 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
11960 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
11970 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
11980 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
11990 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
119a0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
119b0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
119c0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
119d0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
119e0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
119f0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
11a00 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
11a10 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
11a20 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63  .  /* The OS loc
11a30 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  k values must be
11a40 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
11a50 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75   Pager lock valu
11a60 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
11a70 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
11a80 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
11a90 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
11aa0 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
11ab0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
11ac0 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
11ad0 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
11ae0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
11af0 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e  e file is curren
11b00 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65  tly unlocked the
11b10 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20  n the size must 
11b20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20  be unknown */.  
11b30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11b40 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
11b50 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  RED || pPager->d
11b60 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44 42  bSize<0 || MEMDB
11b70 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
11b80 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
11b90 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
11ba0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
11bb0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
11bc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11bd0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
11be0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
11bf0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
11c00 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
11c10 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
11c20 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
11c30 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
11c40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11c50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
11c60 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
11c70 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
11c80 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
11c90 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
11ca0 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
11cb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11cc0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
11cd0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
11ce0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
11cf0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
11d00 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  nt sqlite3PagerT
11d10 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
11d20 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
11d30 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
11d40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11d50 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
11d60 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  RED || MEMDB );.
11d70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
11d80 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
11d90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
11da0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
11db0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
11dc0 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
11dd0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
11de0 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
11df0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
11e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11e10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
11e20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
11e30 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
11e40 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  age;.    pager_t
11e50 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
11e60 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
11e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11e80 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
11e90 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69  nal(pPager);.  i
11ea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11eb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11ec0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
11ed0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
11ee0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
11ef0 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61  se before trunca
11f00 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
11f10 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
11f20 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
11f30 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
11f40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11f50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11f60 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61  ;.  }..  rc = pa
11f70 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
11f80 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 72  ger, nPage);.  r
11f90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11fa0 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
11fb0 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
11fc0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
11fd0 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
11fe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
11ff0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
12000 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
12010 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12020 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
12030 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
12040 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
12050 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
12060 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
12070 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
12080 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
12090 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
120a0 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
120b0 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
120c0 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
120d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
120e0 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
120f0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
12100 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
12110 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12120 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
12130 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
12140 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
12150 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
12160 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
12170 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
12180 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
12190 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
121a0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
121b0 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
121c0 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
121d0 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
121e0 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
121f0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
12200 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
12210 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12220 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12230 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
12240 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61  GEMENT.  /* A ma
12250 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61  lloc() cannot fa
12260 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72  il in sqlite3Thr
12270 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65  eadData() as one
12280 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
12290 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29  o .  ** malloc()
122a0 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
122b0 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20  dy been made by 
122c0 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f  this thread befo
122d0 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20  re it gets.  ** 
122e0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54  to this point. T
122f0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68  his means the Th
12300 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61  readData must ha
12310 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
12320 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73  d already.  ** s
12330 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  o that ThreadDat
12340 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20  a.nAlloc can be 
12350 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65  set..  */.  Thre
12360 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
12370 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
12380 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ();.  assert( pP
12390 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
123a0 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e  ( pTsd && pTsd->
123b0 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66  nAlloc );.#endif
123c0 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
123d0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
123e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
123f0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
12400 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
12410 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
12420 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
12430 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
12440 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
12450 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
12460 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
12470 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
12480 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
12490 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
124a0 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
124b0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
124c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
124d0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50  ->errCode || (pP
124e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
124f0 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  n==0 && pPager->
12500 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a  stmtOpen==0) );.
12510 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
12520 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
12530 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
12540 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
12550 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
12560 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
12570 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
12580 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
12590 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
125a0 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
125b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
125c0 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
125d0 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66  fd);.  /* Temp f
125e0 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  iles are automat
125f0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62  ically deleted b
12600 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66  y the OS.  ** if
12610 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
12620 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c  le ){.  **   sql
12630 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
12640 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
12650 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69  .  ** }.  */..#i
12660 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12670 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
12680 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  MENT.  /* Remove
12690 20 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20   the pager from 
126a0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
126b0 6f 66 20 70 61 67 65 72 73 20 73 74 61 72 74 69  of pagers starti
126c0 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65  ng at .  ** Thre
126d0 61 64 44 61 74 61 2e 70 50 61 67 65 72 20 69 66  adData.pPager if
126e0 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
126f0 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  nt is enabled.. 
12700 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12710 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29  ==pTsd->pPager )
12720 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67  {.    pTsd->pPag
12730 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  er = pPager->pNe
12740 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
12750 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20   Pager *pTmp;.  
12760 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73    for(pTmp = pTs
12770 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d  d->pPager; pTmp-
12780 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20  >pNext!=pPager; 
12790 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74  pTmp=pTmp->pNext
127a0 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e  ){}.    pTmp->pN
127b0 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ext = pPager->pN
127c0 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ext;.  }.#endif.
127d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
127e0 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73  ger->aHash);.  s
127f0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
12800 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
12810 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
12820 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
12830 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
12840 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
12850 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
12860 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
12870 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
12880 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
12890 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
128a0 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
128b0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
128c0 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  age *p){.  retur
128d0 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  n p->pgno;.}.#en
128e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
128f0 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69  age_ref() functi
12900 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68  on increments th
12910 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
12920 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a  t for a page..**
12930 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
12940 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
12950 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72   freelist (the r
12960 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
12970 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20  s zero) then.** 
12980 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  remove it from t
12990 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
129a0 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20  ** For non-test 
129b0 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
129c0 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74  f() is a macro t
129d0 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f  hat calls _page_
129e0 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20  ref().** online 
129f0 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  of the reference
12a00 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20   count is zero. 
12a10 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d   For test system
12a20 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s, page_ref().**
12a30 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74   is a real funct
12a40 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63  ion so that we c
12a50 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e  an set breakpoin
12a60 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e  ts and trace it.
12a70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12a80 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20  _page_ref(PgHdr 
12a90 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
12aa0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
12ab0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20   /* The page is 
12ac0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65  currently on the
12ad0 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f   freelist.  Remo
12ae0 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66  ve it. */.    if
12af0 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67  ( pPg==pPg->pPag
12b00 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
12b10 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
12b20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
12b30 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ree;.      while
12b40 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
12b50 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
12b60 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20  xtFree; }.      
12b70 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12b80 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
12b90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
12ba0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
12bb0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
12bc0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
12bd0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
12be0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12bf0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
12c00 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
12c10 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  xtFree;.    }.  
12c20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
12c30 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
12c40 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
12c50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
12c60 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65  PrevFree;.    }e
12c70 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
12c80 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
12c90 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
12ca0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
12cb0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
12cc0 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b   }.  pPg->nRef++
12cd0 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
12ce0 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;.}.#ifdef SQLIT
12cf0 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63  E_DEBUG.  static
12d00 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50   void page_ref(P
12d10 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20  gHdr *pPg){.    
12d20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
12d30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f   ){.      _page_
12d40 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ref(pPg);.    }e
12d50 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
12d60 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45  nRef++;.      RE
12d70 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20  FINFO(pPg);.    
12d80 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65  }.  }.#else.# de
12d90 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29  fine page_ref(P)
12da0 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30     ((P)->nRef==0
12db0 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76  ?_page_ref(P):(v
12dc0 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29  oid)(P)->nRef++)
12dd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
12de0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
12df0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
12e00 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
12e10 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
12e20 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
12e30 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
12e40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12e50 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
12e60 50 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28  Pg){.  page_ref(
12e70 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pPg);.  return S
12e80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12e90 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
12ea0 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  nal.  In other w
12eb0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
12ec0 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
12ed0 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
12ee0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
12ef0 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
12f00 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
12f10 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
12f20 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20  ** disk.  It is 
12f30 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69  not safe to modi
12f40 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  fy the original 
12f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
12f60 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  til after.** the
12f70 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
12f80 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68  n synced.  If th
12f90 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12fa0 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ase is modified 
12fb0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f  before.** the jo
12fc0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
12fd0 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c  and a power fail
12fe0 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ure occurs, the 
12ff0 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c  unsynced journal
13000 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62  .** data would b
13010 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f  e lost and we wo
13020 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  uld be unable to
13030 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c   completely roll
13040 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  back the.** data
13050 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44  base changes.  D
13060 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
13070 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a  on would occur..
13080 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
13090 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73  ine also updates
130a0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
130b0 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
130c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
130d0 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f   (See comments o
130e0 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  n the pager_play
130f0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  back() routine f
13100 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
13110 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49  formation.).** I
13120 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20  f the sync mode 
13130 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e  is FULL, two syn
13140 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20  cs will occur.  
13150 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20  First the whole 
13160 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79  journal.** is sy
13170 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e  nced, then the n
13180 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
13190 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63  ated, then a sec
131a0 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e  ond sync occurs.
131b0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
131c0 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20  rary databases, 
131d0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69  we do not care i
131e0 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f  f we are able to
131f0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74   rollback.** aft
13200 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
13210 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75  re, so sync occu
13220 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  rs..**.** This r
13230 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
13240 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
13250 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
13260 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
13270 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
13280 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
13290 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
132a0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
132b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
132c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79  ITE_OK;..  /* Sy
132d0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  nc the journal b
132e0 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
132f0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
13300 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67  e.  ** (assuming
13310 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72   there is a jour
13320 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73  nal and it needs
13330 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a   to be synced.).
13340 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
13350 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
13360 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
13370 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
13380 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13390 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
133a0 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74  .      /* assert
133b0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
133c0 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d  c ); // noSync m
133d0 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73  ight be set if s
133e0 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20  ynchronous.     
133f0 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f   ** was turned o
13400 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ff after the tra
13410 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61  nsaction was sta
13420 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36  rted.  Ticket #6
13430 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  15 */.#ifndef ND
13440 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20  EBUG.      {.   
13450 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
13460 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52  e the pPager->nR
13470 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72  ec counter we ar
13480 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73  e keeping agrees
13490 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68  .        ** with
134a0 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74   the nRec comput
134b0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ed from the size
134c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
134d0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
134e0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a  .        i64 jSz
134f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
13500 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
13510 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
13520 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
13530 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
13540 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
13550 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13560 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20  nalOff==jSz );. 
13570 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13580 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
13590 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
135a0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
135b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
135c0 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
135d0 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
135e0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
135f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
13600 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
13610 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
13620 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
13630 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
13640 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
13650 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
13660 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
13670 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
13680 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20  r rollback. .   
13690 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
136a0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
136b0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
136c0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
136d0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
136e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
136f0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
13700 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
13710 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
13720 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
13730 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
13740 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
13750 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
13760 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
13770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13780 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13790 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
137a0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
137c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
137d0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
137e0 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
137f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13800 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49  rn rc;.        I
13810 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
13820 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
13830 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ger,.           
13840 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
13850 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
13860 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
13870 29 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20 72  ), 4)).        r
13880 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
13890 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
138a0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
138b0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
138c0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
138d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
138e0 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
138f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13900 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
13910 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
13920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13930 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
13940 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
13950 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
13960 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  er));.      IOTR
13970 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
13980 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
13990 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
139a0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
139b0 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
139c0 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  sync);.      if(
139d0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
139e0 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
139f0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
13a00 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
13a10 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
13a20 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
13a30 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
13a40 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
13a50 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
13a60 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
13a70 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
13a80 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
13a90 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
13aa0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
13ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
13ac0 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
13ad0 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  r->pFirst;.  }..
13ae0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
13af0 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
13b00 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
13b10 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
13b20 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
13b30 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
13b40 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
13b50 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
13b60 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
13b70 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
13b80 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
13b90 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
13ba0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
13bb0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
13bc0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
13bd0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
13be0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
13bf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13c00 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
13c10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
13c20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13c30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13c40 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69  .** Merge two li
13c50 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e  sts of pages con
13c60 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79  nected by pDirty
13c70 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64   and in pgno ord
13c80 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f  er..** Do not bo
13c90 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50  th fixing the pP
13ca0 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
13cb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  s..*/.static PgH
13cc0 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69  dr *merge_pageli
13cd0 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67  st(PgHdr *pA, Pg
13ce0 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64  Hdr *pB){.  PgHd
13cf0 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c  r result, *pTail
13d00 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73  ;.  pTail = &res
13d10 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41  ult;.  while( pA
13d20 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66   && pB ){.    if
13d30 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70  ( pA->pgno<pB->p
13d40 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61  gno ){.      pTa
13d50 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
13d60 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70  .      pTail = p
13d70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  A;.      pA = pA
13d80 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65  ->pDirty;.    }e
13d90 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  lse{.      pTail
13da0 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
13db0 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b       pTail = pB;
13dc0 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
13dd0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
13de0 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20  }.  if( pA ){.  
13df0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13e00 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = pA;.  }else if
13e10 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pB ){.    pTai
13e20 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
13e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61    }else{.    pTa
13e40 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  il->pDirty = 0;.
13e50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
13e60 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  ult.pDirty;.}../
13e70 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69  *.** Sort the li
13e80 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  st of pages in a
13e90 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  ccending order b
13ea0 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61  y pgno.  Pages a
13eb0 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  re.** connected 
13ec0 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65  by pDirty pointe
13ed0 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69  rs.  The pPrevDi
13ee0 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65  rty pointers are
13ef0 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79  .** corrupted by
13f00 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23   this sort..*/.#
13f10 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
13f20 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64  CKET_ALLOC 25.#d
13f30 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
13f40 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69 66  KET       25.#if
13f50 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
13f60 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61    int sqlite3_pa
13f70 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
13f80 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66 20  t = 0;.  #undef 
13f90 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20  N_SORT_BUCKET.  
13fa0 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
13fb0 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c 69  UCKET \.   (sqli
13fc0 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
13fd0 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f  _bucket?sqlite3_
13fe0 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
13ff0 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ket:N_SORT_BUCKE
14000 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a  T_ALLOC).#endif.
14010 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73 6f  static PgHdr *so
14020 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  rt_pagelist(PgHd
14030 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64 72  r *pIn){.  PgHdr
14040 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   *a[N_SORT_BUCKE
14050 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20  T_ALLOC], *p;.  
14060 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28  int i;.  memset(
14070 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
14080 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29  ;.  while( pIn )
14090 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20  {.    p = pIn;. 
140a0 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72     pIn = p->pDir
140b0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
140c0 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  y = 0;.    for(i
140d0 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =0; i<N_SORT_BUC
140e0 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  KET-1; i++){.   
140f0 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29     if( a[i]==0 )
14100 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
14110 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   p;.        brea
14120 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
14130 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67          p = merg
14140 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
14150 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69   p);.        a[i
14160 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
14170 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
14180 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20  N_SORT_BUCKET-1 
14190 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76 65  ){.      /* Cove
141a0 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65 72  rage: To get her
141b0 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74 6f  e, there need to
141c0 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55   be 2^(N_SORT_BU
141d0 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a 20  CKET) .      ** 
141e0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
141f0 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69 73  input list. This
14200 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62 75   is possible, bu
14210 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20  t impractical.. 
14220 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67 20       ** Testing 
14230 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68 65  this line is the
14240 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c   point of global
14250 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20 20   variable.      
14260 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  ** sqlite3_pager
14270 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a  _n_sort_bucket..
14280 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
14290 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65  [i] = merge_page
142a0 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
142b0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61     }.  }.  p = a
142c0 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [0];.  for(i=1; 
142d0 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b  i<N_SORT_BUCKET;
142e0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d   i++){.    p = m
142f0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c  erge_pagelist(p,
14300 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65   a[i]);.  }.  re
14310 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
14320 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66   Given a list of
14330 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65   pages (connecte
14340 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  d by the PgHdr.p
14350 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77  Dirty pointer) w
14360 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e  rite.** every on
14370 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
14380 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
14390 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61  base file and ma
143a0 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61  rk them all.** a
143b0 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74  s clean..*/.stat
143c0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
143d0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
143e0 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
143f0 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e  er *pPager;.  in
14400 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69  t rc;..  if( pLi
14410 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  st==0 ) return S
14420 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
14430 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
14440 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
14450 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
14460 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
14470 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
14480 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
14490 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
144a0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
144b0 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
144c0 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
144d0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
144e0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  lls to sqlite3Os
144f0 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70  Lock() are no-op
14500 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76  s..  **.  ** Mov
14510 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f  ing the lock fro
14520 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58  m RESERVED to EX
14530 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79  CLUSIVE actually
14540 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a   involves going.
14550 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20    ** through an 
14560 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
14570 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20  te PENDING.   A 
14580 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65  PENDING lock pre
14590 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72  vents new.  ** r
145a0 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61  eaders from atta
145b0 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  ching to the dat
145c0 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73  abase but is uns
145d0 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73  ufficient for us
145e0 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20   to.  ** write. 
145f0 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50   The idea of a P
14600 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74  ENDING lock is t
14610 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65  o prevent new re
14620 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  aders from.  ** 
14630 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20  coming in while 
14640 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73  we wait for exis
14650 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20  ting readers to 
14660 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  clear..  **.  **
14670 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   While the pager
14680 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52   is in the RESER
14690 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f  VED state, the o
146a0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
146b0 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e   file.  ** is un
146c0 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63  changed and we c
146d0 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68  an rollback with
146e0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c  out having to pl
146f0 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20  ayback the.  ** 
14700 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65  journal into the
14710 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
14720 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77  se file.  Once w
14730 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a  e transition to.
14740 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20    ** EXCLUSIVE, 
14750 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  it means the dat
14760 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
14770 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20  een changed and 
14780 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  any rollback.  *
14790 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  * will require a
147a0 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
147b0 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  k..  */.  rc = p
147c0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
147d0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
147e0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
147f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14800 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
14810 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20  .  }..  pList = 
14820 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c  sort_pagelist(pL
14830 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  ist);.  while( p
14840 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65  List ){.    asse
14850 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79  rt( pList->dirty
14860 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
14870 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
14880 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70  r->fd, (pList->p
14890 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
148a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
148b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
148c0 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66  rn rc;.    /* If
148d0 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
148e0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
148f0 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
14900 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
14910 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
14920 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
14930 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
14940 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77  agerTruncate() w
14950 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
14960 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
14970 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
14980 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
14990 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
149a0 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
149b0 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
149c0 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
149d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
149e0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
149f0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
14a00 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
14a10 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
14a20 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
14a30 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
14a40 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  6);.      PAGERT
14a50 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20  RACE3("STORE %d 
14a60 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
14a70 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
14a80 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  st->pgno);.     
14a90 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
14aa0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
14ab0 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29  r, pList->pgno))
14ac0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14ad0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
14ae0 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
14af0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14b00 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
14b10 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
14b20 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
14b30 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
14b40 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
14b50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
14b60 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  st->pgno==1 ){. 
14b70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
14b80 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
14b90 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
14ba0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
14bb0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
14bc0 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65    }.    }.#ifnde
14bd0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
14be0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
14bf0 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
14c00 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
14c10 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
14c20 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
14c30 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
14c40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14c50 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74  .    pList->dirt
14c60 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
14c70 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
14c80 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
14c90 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
14ca0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
14cb0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
14cc0 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
14cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
14ce0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14cf0 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
14d00 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
14d10 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
14d20 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
14d30 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
14d40 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
14d50 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
14d60 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
14d70 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
14d80 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
14d90 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
14da0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
14db0 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
14dc0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
14dd0 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a  ger->pDirty;.}..
14de0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
14df0 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  E if there is a 
14e00 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  hot journal on t
14e10 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
14e20 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** A hot journal
14e30 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65   is one that nee
14e40 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
14e50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14e60 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
14e70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
14e80 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
14e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
14ea0 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
14eb0 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
14ec0 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
14ed0 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
14ee0 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
14ef0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
14f00 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20  Just delete the 
14f10 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
14f20 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
14f30 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
14f40 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
14f50 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
14f60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
14f70 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
14f80 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
14f90 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 72  ournal) ){.    r
14fa0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
14fb0 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  f( sqlite3OsChec
14fc0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
14fd0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
14fe0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
14ff0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
15000 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
15010 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  r)==0 ){.    sql
15020 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
15030 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
15040 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15050 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
15060 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 1;.  }.}../*.*
15070 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20  * Try to find a 
15080 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
15090 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
150a0 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  cycled. .**.** T
150b0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20  his routine may 
150c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
150d0 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ERR, SQLITE_FULL
150e0 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49   or SQLITE_OK. I
150f0 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73  t .** does not s
15100 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  et the pPager->e
15110 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
15120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
15130 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67  ager_recycle(Pag
15140 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
15150 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a  syncOk, PgHdr **
15160 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  ppPg){.  PgHdr *
15170 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30  pPg;.  *ppPg = 0
15180 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d  ;..  assert(!MEM
15190 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  DB);..  /* Find 
151a0 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
151b0 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
151c0 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
151d0 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
151e0 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
151f0 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
15200 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
15210 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
15220 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a  rstSynced;..  /*
15230 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
15240 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
15250 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
15260 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
15270 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
15280 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
15290 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
152a0 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
152b0 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
152c0 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
152d0 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
152e0 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
152f0 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e  imes.  ** it can
15300 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
15310 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20  */.  if( pPg==0 
15320 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
15330 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21  t && syncOk && !
15340 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20  MEMDB){.    int 
15350 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
15360 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
15370 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
15380 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15390 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
153a0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
153b0 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c      /* If in ful
153c0 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69  l-sync mode, wri
153d0 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c  te a new journal
153e0 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65   header into the
153f0 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  .      ** journa
15400 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  l file. This is 
15410 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76  done to avoid ev
15420 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a  er modifying a j
15430 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
15440 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
15450 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
15460 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
15470 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20   that have.     
15480 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e   ** already been
15490 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
154a0 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73  database (in cas
154b0 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a  e the header is.
154c0 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64        ** trashed
154d0 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   when the nRec f
154e0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29  ield is updated)
154f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15500 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
15510 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
15520 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15530 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20  Off > 0 );.     
15540 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15550 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
15560 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
15570 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
15580 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
15590 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
155a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
155b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
155c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
155d0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  t;.  }.  if( pPg
155e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
155f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15600 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
15610 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
15620 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
15630 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15640 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64   file if it is d
15650 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irty..  */.  if(
15660 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
15670 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
15680 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
15690 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d  Sync==0 );.    m
156a0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
156b0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
156c0 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
156d0 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ty = 0;.    rc =
156e0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
156f0 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
15700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15720 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15730 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  }.  assert( pPg-
15740 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  >dirty==0 );..  
15750 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77  /* If the page w
15760 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20  e are recycling 
15770 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  is marked as alw
15780 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  aysRollback, the
15790 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67  n.  ** set the g
157a0 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
157b0 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
157c0 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
157d0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
157e0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  ontRollback() op
157f0 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
15800 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
15810 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
15820 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
15830 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
15840 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
15850 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
15860 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
15870 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
15880 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
15890 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
158a0 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
158b0 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
158c0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
158d0 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
158e0 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
158f0 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
15900 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
15910 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
15920 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
15930 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
15940 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
15950 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53  IOTRACE(("ALWAYS
15960 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c  _ROLLBACK %p\n",
15970 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50   pPager)).    pP
15980 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
15990 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  back = 1;.  }.. 
159a0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
159b0 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
159c0 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
159d0 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
159e0 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28  */.  unlinkPage(
159f0 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  pPg);.  assert( 
15a00 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a  pPg->pgno==0 );.
15a10 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a  .  *ppPg = pPg;.
15a20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15a30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
15a40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15a50 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70  lled to free sup
15a60 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63  erfluous dynamic
15a70 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d  ally allocated m
15a80 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79  emory.** held by
15a90 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65   the pager syste
15aa0 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65  m. Memory in use
15ab0 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70   by any SQLite p
15ac0 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  ager allocated.*
15ad0 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  * by the current
15ae0 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73   thread may be s
15af0 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a 2a  qliteFree()ed..*
15b00 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65  *.** nReq is the
15b10 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
15b20 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69   of memory requi
15b30 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d  red. Once this m
15b40 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  uch has.** been 
15b50 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75  released, the fu
15b60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
15b70 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  A negative value
15b80 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a   for nReq means.
15b90 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68 20  ** free as much 
15ba0 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
15bb0 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  le. The return v
15bc0 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61  alue is the tota
15bd0 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20  l number .** of 
15be0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
15bf0 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66  released..*/.#if
15c00 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15c10 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
15c20 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65  NAGEMENT) && !de
15c30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15c40 54 5f 44 49 53 4b 49 4f 29 0a 69 6e 74 20 73 71  T_DISKIO).int sq
15c50 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
15c60 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
15c70 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  ){.  const Threa
15c80 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20  dData *pTsdro = 
15c90 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
15ca0 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69  aReadOnly();.  i
15cb0 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30  nt nReleased = 0
15cc0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
15cd0 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62   If the the glob
15ce0 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  al mutex is held
15cf0 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
15d00 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a  e becomes a.  **
15d10 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65   o-op; zero byte
15d20 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20  s of memory are 
15d30 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73 20  freed.  This is 
15d40 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d  because.  ** som
15d50 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e  e of the code in
15d60 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66 75  voked by this fu
15d70 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a  nction may also.
15d80 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61    ** try to obta
15d90 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65  in the mutex, re
15da0 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61  sulting in a dea
15db0 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  dlock..  */.  if
15dc0 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74  ( sqlite3OsInMut
15dd0 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74  ex(0) ){.    ret
15de0 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
15df0 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20   Outermost loop 
15e00 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74  runs for at most
15e10 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e   two iterations.
15e20 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   First iteration
15e30 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20   we.  ** try to 
15e40 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74  find memory that
15e50 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
15e60 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
15e70 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64   fsync(). Second
15e80 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20  .  ** iteration 
15e90 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73  (which only runs
15ea0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66 61   if the first fa
15eb0 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65  iled to free nRe
15ec0 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20  q bytes of.  ** 
15ed0 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69  memory) is permi
15ee0 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79  tted to call fsy
15ef0 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66  nc(). This is of
15f00 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72   course much mor
15f10 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76  e .  ** expensiv
15f20 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
15f30 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a  0; i<=1; i++){..
15f40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
15f50 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69  ugh all the SQLi
15f60 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64  te pagers opened
15f70 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
15f80 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50  thread. */.    P
15f90 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
15fa0 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20  Tsdro->pPager;. 
15fb0 20 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65 72     for( ; pPager
15fc0 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e   && (nReq<0 || n
15fd0 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20  Released<nReq); 
15fe0 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
15ff0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48  Next){.      PgH
16000 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69  dr *pPg;.      i
16010 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66  nt rc;..      if
16020 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
16030 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
16040 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
16050 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74  or each pager, t
16060 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61  ry to free as ma
16070 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73  ny pages as poss
16080 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20  ible (without . 
16090 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
160a0 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20  fsync() if this 
160b0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65  is the first ite
160c0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75  ration of the ou
160d0 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a  termost .      *
160e0 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a  * loop)..      *
160f0 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  /.      while( S
16100 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
16110 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
16120 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29 20  ager, i, &pPg)) 
16130 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20  && pPg) {.      
16140 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64    /* We've found
16150 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e   a page to free.
16160 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
16170 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
16180 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d   .        ** rem
16190 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
161a0 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66  ge hash-table, f
161b0 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e  ree-list and syn
161c0 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20  ced-list .      
161d0 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
161e0 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
161f0 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
16200 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
16210 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76          ** Remov
16220 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c  e it from this l
16230 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69  ist before freei
16240 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng..        **. 
16250 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20         ** Todo: 
16260 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e  Check the Pager.
16270 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61  pStmt list to ma
16280 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
16290 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20  Ok. It .        
162a0 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74  ** probably is t
162b0 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a  hough..        *
162c0 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  /.        PgHdr 
162d0 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  *pTmp;.        a
162e0 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20  ssert( pPg );.  
162f0 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
16300 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
16310 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
16320 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  ->pAll = pPg->pN
16330 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20  extAll;.        
16340 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16350 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65   for( pTmp=pPage
16360 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70  r->pAll; pTmp->p
16370 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54  NextAll!=pPg; pT
16380 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  mp=pTmp->pNextAl
16390 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20  l ){}.          
163a0 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d  pTmp->pNextAll =
163b0 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
163c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
163d0 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73    nReleased += s
163e0 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70  qliteAllocSize(p
163f0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  Pg);.        IOT
16400 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
16410 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
16420 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
16430 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
16440 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
16450 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
16460 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
16470 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pPg);.      }.. 
16480 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
164a0 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63    /* An error oc
164b0 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  cured whilst wri
164c0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
164d0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20  base file or .  
164e0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
164f0 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c   in pager_recycl
16500 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69  e(). The error i
16510 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74  s not returned t
16520 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
16530 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73  * caller of this
16540 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65   function. Inste
16550 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ad, set the Page
16560 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62  r.errCode variab
16570 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  le..        ** T
16580 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
16590 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
165a0 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
165b0 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
165c0 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68        ** of a sh
165d0 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65  ared pager cache
165e0 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  ) of the pager f
165f0 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72  or which the err
16600 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  or occured..    
16610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
16620 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29  ssert( (rc&0xff)
16630 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
16640 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  | rc==SQLITE_FUL
16650 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  L );.        ass
16660 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
16670 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
16680 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61  ED );.        pa
16690 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
166a0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
166b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
166c0 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a  rn nReleased;.}.
166d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
166e0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
166f0 41 4e 41 47 45 4d 45 4e 54 20 26 26 20 21 53 51  ANAGEMENT && !SQ
16700 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
16710 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20   */../*.** Read 
16720 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
16730 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
16740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16760 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72  readDbPage(Pager
16770 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
16780 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
16790 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
167a0 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
167b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
167c0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
167d0 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
167e0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
167f0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
16800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16810 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
16820 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  d(pPager->fd, PG
16830 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16850 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
16860 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
16870 20 7d 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28   }.  PAGER_INCR(
16880 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
16890 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
168a0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
168b0 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
168c0 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
168d0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
168e0 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
168f0 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E3("FETCH %d pag
16900 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
16910 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
16920 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  gno);.  if( pgno
16930 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==1 ){.    memcp
16940 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
16950 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47  eVers, &((u8*)PG
16960 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16970 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20  )[24],.         
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169a0 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67       sizeof(pPag
169b0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
169c0 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  ;.  }.  CODEC1(p
169d0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
169e0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
169f0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 72 65 74 75  pgno, 3);.  retu
16a00 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
16a10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16a20 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
16a30 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
16a40 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
16a50 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
16a60 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
16a70 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
16a80 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
16a90 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
16aa0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
16ab0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
16ac0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d   no-op..**.** Im
16ad0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
16ae0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68  obtaining the sh
16af0 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65  ared lock (if re
16b00 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75  quired), this fu
16b10 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73  nction.** checks
16b20 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
16b30 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20  al file. If one 
16b40 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65  is found, an eme
16b50 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a  rgency rollback.
16b60 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ** is performed 
16b70 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
16b80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16b90 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
16ba0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
16bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16bc0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
16bd0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
16be0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21  OCK ){.    if( !
16bf0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
16c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
16c10 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
16c20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
16c30 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
16c40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
16c50 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
16c60 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
16c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16c90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
16ca0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
16cb0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
16cc0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
16cd0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
16ce0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16cf0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
16d00 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
16d10 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
16d20 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
16d30 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
16d40 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
16d50 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16d60 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
16d70 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
16d80 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
16d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16da0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
16db0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
16dc0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
16dd0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
16de0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16df0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
16e00 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
16e10 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
16e20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
16e30 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
16e40 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
16e50 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
16e60 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
16e70 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
16e80 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
16e90 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
16ea0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
16eb0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
16ec0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
16ed0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
16ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
16ef0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
16f00 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
16f10 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
16f20 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
16f30 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
16f40 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
16f50 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
16f60 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
16f70 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
16f80 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
16f90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
16fa0 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
16fb0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
16fc0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
16fd0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
16fe0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
16ff0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
17000 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17010 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
17020 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
17030 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
17040 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
17050 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
17060 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17080 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
17090 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
170a0 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
170b0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
170c0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
170d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
170e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
170f0 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
17100 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
17110 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
17120 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
17130 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
17140 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
17150 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
17160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
17170 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
17180 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
17190 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
171a0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
171b0 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
171c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
171d0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
171e0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
171f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
17200 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
17210 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
17220 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
17230 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
17240 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
17250 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
17260 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
17270 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
17280 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
17290 20 20 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20      **..** Open 
172a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
172b0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
172c0 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
172d0 73 65 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75  se in ..** exclu
172e0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
172f0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
17300 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
17310 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
17320 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
17330 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
17340 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
17350 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
17360 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
17370 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
17380 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
17390 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
173a0 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
173b0 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
173c0 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
173d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
173e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
173f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
17400 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
17410 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
17420 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
17430 20 20 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20         int ro;. 
17440 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17450 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
17460 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
17470 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
17480 65 6e 52 65 61 64 57 72 69 74 65 28 70 50 61 67  enReadWrite(pPag
17490 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
174a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29  Pager->jfd, &ro)
174b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
174c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
174d0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
174e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
174f0 28 20 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  ( ro ){.        
17500 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17510 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
17520 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
17530 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
17540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
17580 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
17590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
175a0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
175b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
175c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
175d0 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
175e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
175f0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
17600 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17610 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
17620 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17630 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
17640 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
17650 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
17660 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  .        /* Play
17670 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
17680 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
17690 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
176a0 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
176b0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
176c0 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
176d0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k..        */.  
176e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
176f0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
17700 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
17710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
17730 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
17740 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
17750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
17760 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
17770 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
17780 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
17790 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
177a0 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
177b0 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
177c0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
177d0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
177e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
177f0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ll ){.        /*
17800 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
17810 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
17820 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
17830 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
17840 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
17850 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
17860 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
17870 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
17880 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  s.        ** rea
17890 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
178a0 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
178b0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
178c0 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
178d0 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
178e0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
178f0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
17900 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
17910 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
17920 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
17930 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
17940 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
17950 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
17960 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
17970 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ng.        ** at
17980 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
17990 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
179a0 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
179b0 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
179c0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
179d0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
179e0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
179f0 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
17a00 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  The.        ** o
17a10 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
17a20 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
17a30 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
17a40 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
17a50 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
17a60 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  se..        ** .
17a70 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65          ** There
17a80 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
17a90 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
17aa0 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
17ab0 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
17ac0 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
17ad0 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
17ae0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
17af0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
17b00 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
17b10 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
17b20 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
17b30 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69         char dbFi
17b40 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
17b50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
17b60 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  )];.        sqli
17b70 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17b80 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
17b90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17ba0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
17bb0 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
17bc0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
17bd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17be0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
17bf0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
17c00 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
17c10 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
17c20 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
17c30 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
17c40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17c50 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
17c60 66 64 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  fd, 24);.       
17c70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17c90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17ca0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17cb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17cc0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
17cd0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
17ce0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
17cf0 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rs));.          
17d00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17d10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
17d20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17d50 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
17d60 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
17d70 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
17d80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
17d90 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
17da0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
17db0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
17dc0 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
17dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
17de0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17e00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
17e10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17e20 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
17e30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50  pPager->state<=P
17e40 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
17e50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
17e60 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
17e70 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
17e80 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
17e90 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
17ea0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
17eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
17ec0 61 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65  ate a PgHdr obje
17ed0 63 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65  ct.   Either cre
17ee0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72  ate a new one or
17ef0 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69   reuse.** an exi
17f00 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69  sting one that i
17f10 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
17f20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  in use..**.** A 
17f30 6e 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74  new PgHdr struct
17f40 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69  ure is created i
17f50 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
17f60 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72  lowing are.** tr
17f70 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ue:.**.**     (1
17f80 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65  )  We have not e
17f90 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69  xceeded our maxi
17fa0 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  mum allocated ca
17fb0 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
17fc0 20 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74       as set by t
17fd0 68 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  he "PRAGMA cache
17fe0 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a  _size" command..
17ff0 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54  **.**     (2)  T
18000 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73  here are no unus
18010 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ed PgHdr objects
18020 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68   available at th
18030 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  is time..**.**  
18040 20 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20     (3)  This is 
18050 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
18060 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
18070 20 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20   (4)  There are 
18080 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  no PgHdr objects
18090 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71   that do not req
180a0 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  uire a journal.*
180b0 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  *          file 
180c0 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20  sync and a sync 
180d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
180e0 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
180f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f  .**          pro
18100 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  hibited..**.** O
18110 74 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20  therwise, reuse 
18120 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64  an existing PgHd
18130 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
18140 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20  ds, reuse an.** 
18150 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69  existing PgHdr i
18160 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
18170 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
18180 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
18190 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20  We have reached 
181a0 6f 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20  or exceeded the 
181b0 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69  maximum cache si
181c0 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ze.**          a
181d0 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d  llowed by "PRAGM
181e0 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a  A cache_size"..*
181f0 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
18200 65 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61  ere is a PgHdr a
18210 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67  vailable with Pg
18220 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a  Hdr->nRef==0.**.
18230 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61  **     (3)  We a
18240 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d  re not in an in-
18250 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a  memory database.
18260 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45  **.**     (4)  E
18270 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61  ither there is a
18280 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64  n available PgHd
18290 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  r that does not 
182a0 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  need.**         
182b0 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f   to be synced to
182c0 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69   disk or else di
182d0 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75  sk syncing is cu
182e0 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
182f0 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a      allowed..*/.
18300 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
18310 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67  AllocatePage(Pag
18320 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
18330 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74  r **ppPg){.  int
18340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18350 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
18360 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
18370 77 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f  w PgHdr if any o
18380 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69  f the four condi
18390 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20  tions defined . 
183a0 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74   ** above is met
183b0 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  : */.  if( pPage
183c0 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
183d0 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50  >mxPage.   || pP
183e0 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20  ager->pFirst==0 
183f0 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20  .   || MEMDB.   
18400 7c 7c 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72  || (pPager->pFir
18410 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70  stSynced==0 && p
18420 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
18430 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ).  ){.    if( p
18440 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50  Pager->nPage>=pP
18450 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20  ager->nHash ){. 
18460 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a       pager_resiz
18470 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61  e_hash_table(pPa
18480 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50  ger,.         pP
18490 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20  ager->nHash<256 
184a0 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e  ? 256 : pPager->
184b0 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20  nHash*2);.      
184c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  if( pPager->nHas
184d0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
184e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
184f0 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  M;.        goto 
18500 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
18510 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
18520 7d 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  }.    pPg = sqli
18530 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
18540 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67  eof(*pPg) + pPag
18550 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20  er->pageSize.   
18560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18570 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
18580 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
18590 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
185c0 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b  of(PgHistory) );
185d0 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20  .    if( pPg==0 
185e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
185f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
18600 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
18610 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
18620 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c  .    memset(pPg,
18630 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
18640 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
18650 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
18660 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
18670 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
18680 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
18690 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ));.    }.    pP
186a0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
186b0 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
186c0 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
186d0 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72  pAll;.    pPager
186e0 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
186f0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
18700 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
18710 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78  /* Recycle an ex
18720 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74 68  isting page with
18730 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e   a zero ref-coun
18740 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  t. */.    rc = p
18750 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
18760 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20  ger, 1, &pPg);. 
18770 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18790 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
187a0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
187b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
187c0 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
187d0 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
187e0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
187f0 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
18800 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
18810 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18820 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
18830 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
18840 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
18850 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
18860 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
18870 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
18880 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
18890 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
188a0 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
188b0 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
188c0 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
188d0 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
188e0 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
188f0 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
18900 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
18910 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
18920 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
18930 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
18940 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
18950 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
18960 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
18970 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
18980 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
18990 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
189a0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
189b0 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
189c0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
189d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
189e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
189f0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
18a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18a20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
18a30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18a40 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
18a50 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
18a60 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
18a70 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
18a80 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
18a90 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
18aa0 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
18ab0 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
18ac0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
18ad0 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
18ae0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18af0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
18b00 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
18b10 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
18b20 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
18b30 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
18b40 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
18b50 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
18b60 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
18b70 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
18b80 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
18b90 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
18ba0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
18bb0 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
18bc0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
18bd0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
18be0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
18bf0 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
18c00 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
18c10 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
18c20 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
18c30 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
18c40 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
18c50 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
18c60 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
18c70 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
18c80 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
18c90 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
18ca0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
18cb0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
18cc0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
18cd0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
18ce0 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
18cf0 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
18d00 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
18d10 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
18d20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
18d30 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
18d40 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
18d50 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
18d60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
18d70 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
18d80 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
18d90 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
18da0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
18db0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
18dc0 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
18dd0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
18de0 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
18df0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
18e00 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
18e10 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
18e20 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
18e30 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
18e40 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
18e50 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
18e60 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
18e70 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
18e80 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
18e90 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
18ea0 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
18eb0 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
18ec0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
18ed0 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
18ee0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
18ef0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
18f00 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
18f10 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
18f20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
18f30 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
18f40 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
18f50 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
18f60 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
18f70 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
18f80 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
18f90 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
18fa0 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
18fb0 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
18fc0 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
18fd0 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
18fe0 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
18ff0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19000 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
19010 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
19020 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19030 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
19040 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
19050 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
19060 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
19070 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
19080 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
19090 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
190a0 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
190b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
190c0 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
190d0 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
190e0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
190f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
19100 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
19110 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
19120 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
19130 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
19140 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
19150 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
19160 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
19170 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
19180 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
19190 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
191a0 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
191b0 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
191c0 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
191d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
191e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
191f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
19200 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
19210 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
19220 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
19230 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
19240 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
19250 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
19260 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
19270 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
19280 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
19290 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
192a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
192b0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
192c0 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
192d0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
192e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
192f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19300 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
19310 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
19320 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
19330 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
19340 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
19350 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
19360 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
19370 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
19380 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
19390 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
193a0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
193b0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
193c0 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
193d0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
193e0 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
193f0 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
19400 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
19410 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
19420 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
19430 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
19440 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
19450 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
19460 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
19470 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
19480 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
19490 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
194a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
194b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
194c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
194d0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
194e0 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  K );..  pPg = pa
194f0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
19500 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
19510 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
19520 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
19530 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
19540 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
19550 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20  .    int nMax;. 
19560 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41     int h;.    PA
19570 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
19580 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20  >nMiss);.    rc 
19590 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50  = pagerAllocateP
195a0 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  age(pPager, &pPg
195b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
195c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
195d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
195e0 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e   }..    pPg->pgn
195f0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73  o = pgno;.    as
19600 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20  sert( !MEMDB || 
19610 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d  pgno>pPager->stm
19620 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  tSize );.    if(
19630 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19640 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
19650 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
19660 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
19670 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79  lite3CheckMemory
19680 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
19690 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
196a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
196b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
196c0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
196d0 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
196e0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
196f0 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
19700 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
19710 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
19720 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
19730 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
19740 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
19750 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
19760 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b  ;.    }..    mak
19770 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
19780 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
19790 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
197a0 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
197b0 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
197c0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
197d0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
197e0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
197f0 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
19800 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
19810 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
19820 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
19830 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
19840 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19850 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
19860 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
19870 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
19880 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
19890 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75  Code;.      retu
198a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
198b0 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
198c0 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
198d0 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
198e0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
198f0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
19900 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
19910 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
19920 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
19930 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
19940 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
19950 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
19960 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
19970 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
19980 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
19990 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
199a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
199b0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
199c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
199d0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
199e0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
199f0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
19a00 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
19a10 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
19a20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
19a30 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
19a40 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
19a50 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
19a60 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
19a70 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
19a80 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
19a90 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
19aa0 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
19ab0 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
19ac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19ad0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
19ae0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
19af0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
19b00 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
19b10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
19b20 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
19b30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19b40 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
19b50 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
19b60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
19b70 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
19b80 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
19b90 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
19ba0 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
19bb0 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
19bc0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
19bd0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
19be0 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
19bf0 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
19c00 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
19c10 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
19c20 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
19c30 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
19c40 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
19c50 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
19c60 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
19c70 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
19c80 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
19c90 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
19ca0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
19cb0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
19cc0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
19cd0 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
19ce0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
19cf0 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
19d00 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
19d10 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
19d20 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
19d30 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
19d40 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
19d50 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
19d60 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
19d70 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
19d80 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
19d90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
19da0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19db0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19dc0 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
19dd0 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
19de0 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
19df0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19e00 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
19e10 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
19e20 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
19e30 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
19e40 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
19e50 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
19e60 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
19e70 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
19e80 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
19e90 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
19ea0 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
19eb0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
19ec0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
19ed0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
19ee0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
19ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
19f00 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
19f10 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
19f20 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
19f30 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
19f40 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
19f50 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
19f60 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
19f70 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
19f80 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
19f90 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
19fa0 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
19fb0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
19fc0 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
19fd0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
19fe0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
19ff0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1a000 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1a010 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1a020 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
1a030 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
1a040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1a050 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1a060 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1a070 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c   !pPager->pAll |
1a080 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  | pPager->exclus
1a090 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72  iveMode );.    r
1a0a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1a0b0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1a0c0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
1a0d0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
1a0e0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
1a0f0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
1a100 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1a110 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1a120 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
1a130 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
1a140 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
1a150 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1a160 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1a170 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1a180 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1a190 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1a1a0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1a1b0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1a1c0 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1a1d0 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1a1e0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1a1f0 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1a200 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1a210 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1a220 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1a230 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1a240 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1a250 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1a260 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f  Page *pPg){..  /
1a270 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1a280 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1a290 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
1a2a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
1a2b0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
1a2c0 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
1a2d0 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48  INFO(pPg);..  CH
1a2e0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
1a2f0 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
1a300 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
1a310 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
1a320 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
1a330 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
1a340 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
1a350 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1a360 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1a370 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1a380 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
1a390 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
1a3a0 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
1a3b0 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
1a3c0 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
1a3d0 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
1a3e0 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
1a3f0 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
1a400 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
1a410 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
1a420 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
1a430 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
1a440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a450 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
1a460 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1a470 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
1a480 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
1a490 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1a4a0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1a4b0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
1a4c0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
1a4d0 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
1a4e0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
1a4f0 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1a500 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
1a510 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1a520 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
1a530 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
1a540 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
1a550 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
1a560 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
1a570 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1a580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
1a590 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
1a5a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a5b0 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
1a5c0 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
1a5d0 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e  =0 && (!pPager->
1a5e0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1a5f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a600 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  Off>0) ){.      
1a610 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
1a620 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1a630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a650 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1a660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a670 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
1a680 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
1a690 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
1a6a0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
1a6b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a6c0 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
1a6d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a6e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
1a6f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1a700 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
1a710 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1a720 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
1a730 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
1a740 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1a750 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1a760 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
1a770 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1a780 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1a790 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
1a7a0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1a7b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1a7c0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1a7d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a7e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1a7f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a800 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1a810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a820 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a830 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1a840 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1a850 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
1a860 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1a870 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1a880 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1a890 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1a8a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1a8b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a8c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
1a8d0 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1a8e0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1a8f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a900 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
1a910 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1a920 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  &pPager->jfd,.  
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a950 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
1a960 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
1a970 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1a980 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50  ger->jfd );.  pP
1a990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1a9a0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1a9b0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1a9c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a9d0 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
1a9e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a9f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aa00 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
1aa10 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1aa20 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
1aa30 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  al);.    }.    g
1aa40 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1aa50 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1aa60 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
1aa70 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
1aa80 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
1aa90 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
1aaa0 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
1aab0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1aac0 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
1aad0 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
1aae0 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
1aaf0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
1ab00 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
1ab10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1ab20 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
1ab30 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1ab40 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1ab50 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
1ab60 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1ab70 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
1ab80 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1ab90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1aba0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
1abb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1abc0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
1abd0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1abe0 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
1abf0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1ac00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
1ac10 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1ac20 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
1ac30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ac40 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
1ac50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ac60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ac70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
1ac80 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1ac90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1aca0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
1acb0 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
1acc0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1acd0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
1ace0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1acf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1ad00 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
1ad10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ad20 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
1ad30 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
1ad40 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1ad50 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
1ad60 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1ad70 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
1ad80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ad90 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
1ada0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1adb0 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
1adc0 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
1add0 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
1ade0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
1adf0 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
1ae00 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1ae10 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
1ae20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1ae30 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1ae40 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
1ae50 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1ae60 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
1ae70 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1ae80 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ae90 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
1aea0 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
1aeb0 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
1aec0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
1aed0 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
1aee0 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
1aef0 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
1af00 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
1af10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
1af20 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
1af30 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
1af40 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
1af50 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
1af60 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1af70 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1af80 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
1af90 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
1afa0 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1afb0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1afc0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
1afd0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1afe0 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
1aff0 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
1b000 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
1b010 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
1b020 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
1b030 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1b040 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
1b050 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1b060 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
1b070 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
1b080 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
1b090 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
1b0a0 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
1b0b0 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
1b0c0 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
1b0d0 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
1b0e0 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
1b0f0 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
1b100 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
1b110 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1b120 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1b130 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
1b140 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
1b150 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
1b160 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1b170 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
1b180 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
1b190 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
1b1a0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1b1b0 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
1b1c0 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
1b1d0 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
1b1e0 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
1b1f0 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
1b200 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
1b210 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
1b220 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
1b230 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1b240 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
1b250 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
1b260 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
1b270 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1b280 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1b290 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b2a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1b2b0 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
1b2c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1b2d0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1b2e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1b2f0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1b300 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
1b310 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1b320 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
1b330 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1b340 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1b350 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1b360 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1b370 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
1b380 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1b390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1b3a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1b3b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
1b3c0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
1b3d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b3e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b3f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1b400 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
1b410 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
1b420 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
1b430 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1b440 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1b450 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1b460 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b470 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
1b480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b490 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b4a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b4b0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1b4c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
1b4d0 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
1b4e0 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
1b4f0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b500 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1b510 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1b520 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1b530 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b540 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1b550 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1b560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1b570 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1b580 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1b590 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b5a0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1b5b0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1b5c0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1b5d0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1b5e0 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
1b5f0 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
1b600 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
1b610 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
1b620 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
1b630 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1b640 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
1b650 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
1b660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b670 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
1b680 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
1b690 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1b6a0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
1b6b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1b6c0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1b6d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1b6e0 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1b6f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b700 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1b710 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1b720 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1b730 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1b740 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1b750 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1b760 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1b770 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1 );.    if( !p
1b780 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b790 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1b7a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b7b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b7c0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b7d0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1b7e0 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ze;.      rc = w
1b7f0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1b800 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1b810 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  }.  assert( !pPa
1b820 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b830 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1b840 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d  nalOff>0 || rc!=
1b850 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
1b860 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b870 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
1b880 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
1b890 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
1b8a0 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
1b8b0 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
1b8c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1b8d0 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
1b8e0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1b8f0 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
1b900 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1b910 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1b920 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
1b930 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
1b940 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
1b950 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
1b960 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
1b970 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1b980 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
1b990 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1b9a0 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
1b9b0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1b9c0 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
1b9d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1b9e0 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
1b9f0 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
1ba00 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
1ba10 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
1ba20 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
1ba30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1ba40 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
1ba50 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1ba60 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
1ba70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1ba80 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
1ba90 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1baa0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
1bab0 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
1bac0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
1bad0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
1bae0 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1baf0 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69  >pPrevDirty->pDi
1bb00 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1bb10 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1bb20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
1bb30 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1bb40 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
1bb50 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  .}.../*.** Mark 
1bb60 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
1bb70 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
1bb80 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1bb90 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1bba0 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
1bbb0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
1bbc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
1bbd0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
1bbe0 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
1bbf0 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
1bc00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1bc10 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1bc20 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
1bc30 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
1bc40 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
1bc50 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
1bc60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
1bc70 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1bc80 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
1bc90 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
1bca0 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
1bcb0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1bcc0 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
1bcd0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1bce0 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
1bcf0 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
1bd00 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
1bd10 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
1bd20 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
1bd30 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
1bd40 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1bd50 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1bd60 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1bd70 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
1bd80 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
1bd90 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
1bda0 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
1bdb0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1bdc0 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
1bdd0 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
1bde0 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
1bdf0 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
1be00 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
1be10 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
1be20 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
1be30 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
1be40 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
1be50 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
1be60 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1be70 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
1be80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1be90 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
1bea0 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
1beb0 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
1bec0 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61  _DATA(pPg);.  Pa
1bed0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1bee0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1bef0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bf00 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1bf10 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
1bf20 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1bf30 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
1bf40 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1bf50 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1bf60 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
1bf70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1bf80 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
1bf90 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1bfa0 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
1bfb0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1bfc0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1bfd0 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
1bfe0 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1bff0 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1c000 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
1c010 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
1c020 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
1c030 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1c040 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
1c050 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
1c060 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
1c070 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
1c080 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1c090 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
1c0a0 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
1c0b0 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
1c0c0 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
1c0d0 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
1c0e0 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
1c0f0 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
1c100 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
1c110 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
1c120 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
1c130 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1c140 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
1c150 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
1c160 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
1c170 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1c180 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
1c190 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1c1a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c1b0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1c1c0 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
1c1d0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
1c1e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1c1f0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1c200 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
1c210 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
1c220 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
1c230 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
1c240 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
1c250 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74  nal && (pageInSt
1c260 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20  atement(pPg) || 
1c270 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c280 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
1c290 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1c2a0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1c2b0 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1c2c0 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1c2d0 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1c2e0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1c2f0 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1c300 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1c310 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1c320 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1c330 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1c340 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1c350 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1c360 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1c370 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1c380 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1c390 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1c3a0 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1c3b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1c3c0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1c3d0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1c3e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c3f0 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1c400 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c430 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c440 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c450 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1c460 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1c470 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1c480 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1c490 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1c4a0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1c4b0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1c4c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c4d0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1c4e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c4f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c500 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1c510 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1c520 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1c530 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
1c540 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1c550 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1c560 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1c570 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1c580 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1c590 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1c5a0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1c5b0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1c5c0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1c5d0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1c5e0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1c5f0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1c600 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1c610 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
1c620 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1c630 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1c640 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
1c650 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
1c660 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1c670 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1c680 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
1c690 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Pg;.        if( 
1c6a0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1c6b0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1c6c0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1c6d0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1c6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1c6f0 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
1c700 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1c710 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c720 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c730 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c740 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
1c750 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1c760 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
1c770 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
1c780 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1c790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
1c7a0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1c7b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1c7c0 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
1c7d0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1c7e0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1c7f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1c800 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1c810 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
1c820 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
1c830 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1c840 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  ta2, *pEnd;.    
1c850 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1c860 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1c870 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1c880 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1c890 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1c8a0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1c8b0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1c8c0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1c8d0 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1c8e0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
1c8f0 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
1c900 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1c910 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1c920 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1c930 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
1c940 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1c950 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1c960 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1c970 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1c980 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1c990 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1c9a0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
1c9b0 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
1c9c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
1c9d0 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
1c9e0 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
1c9f0 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
1ca00 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1ca10 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
1ca20 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
1ca30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ca40 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
1ca50 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
1ca60 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1ca70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ca80 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1ca90 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1caa0 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
1cab0 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1cac0 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1cad0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1cae0 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
1caf0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1cb00 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67  journalOff, szPg
1cb10 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  ));.          PA
1cb20 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1cb30 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1cb40 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
1cb50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cb60 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1cb70 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1cb80 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
1cb90 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1cba0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1cbb0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1cbc0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1cbd0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1cbe0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  c);.          *(
1cbf0 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
1cc00 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72  d;...  /* An err
1cc10 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
1cc20 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
1cc30 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
1cc40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
1cc50 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
1cc60 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
1cc70 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
1cc80 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1cc90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1cca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ccb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1ccc0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
1ccd0 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
1cce0 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1ccf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1cd00 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1cd10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1cd20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1cd30 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
1cd40 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1cd50 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1cd60 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1cd70 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1cd80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1cd90 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1cda0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cdb0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1cdc0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1cdd0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1cde0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1cdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1ce00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67  lse{.        pPg
1ce10 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
1ce20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1ce30 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
1ce40 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
1ce50 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50   PAGERTRACE4("AP
1ce60 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
1ce70 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1cea0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1ceb0 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
1cec0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
1ced0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
1cee0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1cef0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1cf00 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
1cf10 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1cf20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
1cf30 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
1cf40 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
1cf50 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
1cf60 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
1cf70 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
1cf80 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1cf90 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1cfa0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
1cfb0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
1cfc0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1cfd0 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
1cfe0 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
1cff0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
1d000 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
1d010 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
1d020 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
1d030 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
1d040 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1d050 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20  tInUse .     && 
1d060 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
1d070 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28  (pPg) .     && (
1d080 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
1d090 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1d0a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
1d0b0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1d0c0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1d0d0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1d0e0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1d0f0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1d100 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1d110 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1d120 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1d130 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
1d140 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
1d150 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
1d160 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1d170 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1d180 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
1d190 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
1d1a0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
1d1b0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1d1c0 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
1d1d0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1d1e0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1d1f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1d200 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
1d210 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1d220 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1d230 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1d240 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1d250 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
1d260 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1d270 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
1d280 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1d290 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1d2a0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1d2b0 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20  g->pgno, 7)-4;. 
1d2c0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1d2d0 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1d2e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
1d2f0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1d300 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1d310 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1d320 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
1d330 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1d340 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1d350 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1d360 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1d370 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1d380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d390 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d3a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1d3c0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
1d3d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1d3e0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1d3f0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1d400 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1d410 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1d420 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1d430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d440 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
1d450 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1d460 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
1d470 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1d480 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1d490 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
1d4a0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1d4b0 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
1d4c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1d4d0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
1d4e0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
1d4f0 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
1d500 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
1d510 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
1d520 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
1d530 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
1d540 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d550 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d560 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d570 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
1d580 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
1d590 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
1d5a0 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
1d5b0 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
1d5c0 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
1d5d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1d5e0 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
1d5f0 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
1d600 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
1d610 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1d620 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1d630 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
1d640 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
1d650 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
1d660 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
1d670 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1d680 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
1d690 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
1d6a0 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
1d6b0 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
1d6c0 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
1d6d0 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
1d6e0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
1d6f0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1d700 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
1d710 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1d720 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1d730 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
1d740 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
1d750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d760 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
1d770 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
1d780 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1d790 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
1d7a0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
1d7b0 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
1d7c0 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
1d7d0 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21  eSize);..  if( !
1d7e0 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65  MEMDB && nPagePe
1d7f0 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
1d800 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
1d810 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1d820 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1d830 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1d840 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
1d850 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
1d860 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
1d870 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1d880 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1d890 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
1d8a0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1d8b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d8c0 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
1d8d0 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
1d8e0 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
1d8f0 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  i;..    /* Set t
1d900 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
1d910 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
1d920 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
1d930 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61  t allow a journa
1d940 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20  l.    ** header 
1d950 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
1d960 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
1d970 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69  journaled by thi
1d980 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
1d990 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1d9a0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1d9b0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1d9c0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
1d9d0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
1d9e0 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
1d9f0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
1da00 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
1da10 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
1da20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
1da30 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
1da40 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
1da50 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
1da60 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
1da70 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1da80 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1da90 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
1daa0 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
1dab0 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
1dac0 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
1dad0 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
1dae0 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  unt = sqlite3Pag
1daf0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1db00 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  er);.    if( pPg
1db10 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
1db20 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
1db30 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
1db40 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
1db50 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
1db60 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
1db70 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1db80 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f   nPage = nPageCo
1db90 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d  unt+1-pg1;.    }
1dba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
1dbb0 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74  e = nPagePerSect
1dbc0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
1dbd0 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20  sert(nPage>0);. 
1dbe0 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
1dbf0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
1dc00 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
1dc10 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
1dc20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1dc30 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
1dc40 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
1dc50 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70       Pgno pg = p
1dc60 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69 66 28  g1+ii;.      if(
1dc70 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
1dc80 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d  rnal || pg==pPg-
1dc90 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20  >pgno || .      
1dca0 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f      pg>pPager->o
1dcb0 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70  rigDbSize || !(p
1dcc0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1dcd0 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26  l[pg/8]&(1<<(pg&
1dce0 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20  7))).      ) {. 
1dcf0 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
1dd00 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1dd10 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
1dd20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
1dd30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1dd40 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1dd50 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
1dd60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1dd70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1dd90 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1dda0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1ddb0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ddc0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
1ddd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dde0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ddf0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1de00 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1de10 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
1de20 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
1de30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1de40 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1de50 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
1de60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1de70 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1de80 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
1de90 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1dea0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
1deb0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
1dec0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ded0 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
1dee0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
1def0 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
1df00 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
1df10 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1df20 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1df30 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
1df40 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1df50 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
1df60 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
1df70 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
1df80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1df90 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65  _VACUUM./*.** Re
1dfa0 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
1dfb0 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
1dfc0 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
1dfd0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
1dfe0 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
1dff0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e000 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50  PagerOverwrite(P
1e010 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1e020 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
1e030 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
1e040 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
1e050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e060 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
1e070 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  gno, &pPg);.  if
1e080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e090 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1e0a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1e0b0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
1e0c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e0d0 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
1e0e0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
1e0f0 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  g), pData, pPage
1e100 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1e110 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
1e120 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1e130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e140 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1e150 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1e160 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1e170 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
1e180 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1e190 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
1e1a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
1e1b0 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
1e1c0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
1e1d0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
1e1e0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
1e1f0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
1e200 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
1e210 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
1e220 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1e230 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
1e240 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
1e250 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
1e260 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
1e270 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
1e280 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
1e290 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
1e2a0 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
1e2b0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
1e2c0 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
1e2d0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
1e2e0 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
1e2f0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
1e300 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1e310 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
1e320 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
1e330 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
1e340 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
1e350 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
1e360 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
1e370 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
1e380 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
1e390 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
1e3a0 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
1e3b0 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
1e3c0 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
1e3d0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
1e3e0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1e3f0 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
1e400 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
1e410 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
1e420 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
1e430 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
1e440 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
1e450 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
1e460 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
1e470 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
1e480 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
1e490 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
1e4a0 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
1e4b0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
1e4c0 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
1e4d0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
1e4e0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
1e4f0 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
1e500 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1e510 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
1e520 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
1e530 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
1e540 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e550 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
1e560 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c  used,.** the sql
1e570 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e580 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
1e590 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
1e5a0 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
1e5b0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69  age contains cri
1e5c0 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
1e5d0 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
1e5e0 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20  sure it gets.** 
1e5f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
1e600 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69  pite of the sqli
1e610 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1e620 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
1e630 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1e640 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67  rDontWrite(DbPag
1e650 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50  e *pDbPage){.  P
1e660 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1e670 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1e680 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e690 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  er;..  if( MEMDB
1e6a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 67   ) return;.  pPg
1e6b0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1e6c0 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
1e6d0 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65  >dirty && !pPage
1e6e0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1e6f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e700 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1e710 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1e720 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1e730 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1e740 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1e750 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1e760 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1e770 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1e780 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1e790 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1e7a0 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1e7b0 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1e7c0 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1e7d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1e7e0 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1e7f0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1e800 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1e810 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e820 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1e830 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1e840 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1e850 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1e860 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1e870 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1e880 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1e890 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1e8a0 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1e8b0 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1e8c0 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1e8d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1e8e0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1e8f0 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1e900 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1e910 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1e920 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1e930 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1e940 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1e950 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1e960 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1e970 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1e980 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
1e990 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1e9a0 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
1e9b0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1e9c0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
1e9d0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1e9e0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1e9f0 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
1ea00 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
1ea10 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1ea20 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
1ea30 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1ea40 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1ea50 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
1ea60 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1ea70 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1ea80 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1ea90 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
1eaa0 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
1eab0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1eac0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1ead0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
1eae0 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
1eaf0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1eb00 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
1eb10 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
1eb20 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
1eb30 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
1eb40 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
1eb50 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
1eb60 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
1eb70 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
1eb80 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
1eb90 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
1eba0 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
1ebb0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1ebc0 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
1ebd0 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
1ebe0 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
1ebf0 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
1ec00 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
1ec10 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
1ec20 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
1ec30 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
1ec40 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
1ec50 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
1ec60 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
1ec70 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
1ec80 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1ec90 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72  pPager;..  asser
1eca0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1ecb0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1ecc0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1ecd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1ece0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1ecf0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1ed00 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
1ed10 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1ed20 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  | MEMDB ) return
1ed30 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  ;.  if( !pPg->in
1ed40 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1ed50 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1ed60 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1ed70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ed80 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ed90 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l!=0 );.    pPag
1eda0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1edb0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1edc0 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1edd0 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
1ede0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  nal = 1;.    pPg
1edf0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1ee00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1ee10 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1ee20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1ee30 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1ee40 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1ee50 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50  &7);.    }.    P
1ee60 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
1ee70 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
1ee80 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1ee90 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1eea0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54  Pager));.    IOT
1eeb0 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
1eec0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1eed0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d   pPg->pgno)).  }
1eee0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1eef0 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26 26 20  tmtInUse .   && 
1ef00 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
1ef10 28 70 50 67 29 20 0a 20 20 20 26 26 20 28 69 6e  (pPg) .   && (in
1ef20 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1ef30 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20  ger->stmtSize . 
1ef40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ef50 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
1ef60 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
1ef70 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
1ef80 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
1ef90 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
1efa0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  mt!=0 );.    pPa
1efb0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1efc0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1efd0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1efe0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
1eff0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f000 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
1f010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f020 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
1f030 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
1f040 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
1f050 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
1f060 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
1f070 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1f080 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
1f090 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
1f0a0 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1f0b0 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1f0c0 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
1f0d0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1f0e0 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  ne ){.    /* Ope
1f0f0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
1f100 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
1f110 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1f120 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1f130 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
1f140 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f150 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f160 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
1f170 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f180 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  (pPgHdr);.    if
1f190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f1a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a  ) return rc;.  .
1f1b0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1f1c0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1f1d0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1f1e0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1f1f0 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
1f200 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 20 20  (pPgHdr, 24);.  
1f210 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1f220 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1f230 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1f240 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1f250 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
1f260 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
1f270 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1f280 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
1f290 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
1f2a0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1f2b0 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65   .    /* Release
1f2c0 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
1f2d0 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
1f2e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1f2f0 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
1f300 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1f310 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
1f320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f330 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
1f340 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f350 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
1f360 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
1f370 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
1f380 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
1f390 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1f3a0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1f3b0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
1f3c0 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
1f3d0 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
1f3e0 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
1f3f0 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
1f400 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
1f410 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
1f420 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1f430 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1f440 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
1f450 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
1f460 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
1f470 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
1f480 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
1f490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f4a0 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
1f4b0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
1f4c0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
1f4d0 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
1f4e0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
1f4f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
1f500 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1f510 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
1f520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f530 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
1f540 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1f550 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
1f560 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
1f570 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
1f580 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
1f590 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
1f5a0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f5b0 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
1f5c0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1f5d0 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
1f5e0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
1f5f0 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
1f600 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
1f610 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
1f620 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
1f630 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1f640 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
1f650 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f660 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61  seOne(Pager *pPa
1f670 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
1f680 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
1f690 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
1f6a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1f6b0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41   PAGERTRACE4("DA
1f6c0 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
1f6d0 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
1f6e0 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
1f6f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
1f700 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
1f710 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20   nTrunc);..  /* 
1f720 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
1f730 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
1f740 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
1f750 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
1f760 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1f770 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1f780 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
1f790 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1f7a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1f7b0 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
1f7c0 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
1f7d0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1f7e0 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
1f7f0 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
1f800 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f810 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a  lOpen );..    /*
1f820 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1f830 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
1f840 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f850 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
1f860 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1f870 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
1f880 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
1f890 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1f8a0 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
1f8b0 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
1f8c0 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
1f8d0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
1f8e0 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
1f8f0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1f900 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
1f910 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
1f920 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
1f930 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
1f940 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
1f950 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
1f960 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1f970 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1f980 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1f990 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
1f9a0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1f9b0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1f9c0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1f9d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1f9e0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23  oto sync_exit;.#
1f9f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fa00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1fa10 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1fa20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1fa30 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1fa40 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1fa50 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1fa60 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1fa70 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69  s.        ** bei
1fa80 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
1fa90 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
1faa0 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
1fab0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
1fac0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
1fad0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1fae0 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
1faf0 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
1fb00 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1fb10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  er);.        for
1fb20 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1fb30 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1fb40 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1fb50 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67        if( !(pPag
1fb60 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69  er->aInJournal[i
1fb70 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29  /8] & (1<<(i&7))
1fb80 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1fb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fba0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1fbb0 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1fbc0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
1fbd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fbe0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fbf0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1fc00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fc10 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1fc20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fc30 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1fc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fc50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fc60 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fc70 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fc80 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a       } .      }.
1fc90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
1fca0 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
1fcb0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
1fcc0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
1fcd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fce0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fcf0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
1fd00 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1fd10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1fd20 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1fd30 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1fd40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fd50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fd60 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21  .    if( nTrunc!
1fd70 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1fd80 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1fd90 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1fda0 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
1fdb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fdc0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fdd0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1fde0 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
1fdf0 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
1fe00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fe10 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
1fe20 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1fe30 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1fe40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1fe50 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1fe60 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1fe70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fe80 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fe90 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1fea0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  = 0;..    /* Syn
1feb0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1fec0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
1fed0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
1fee0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1fef0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1ff00 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20  er->fd, 0);.    
1ff10 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
1ff20 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
1ff30 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67  ager))..    pPag
1ff40 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1ff50 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73  R_SYNCED;.  }els
1ff60 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e  e if( MEMDB && n
1ff70 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1ff80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ff90 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
1ffa0 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a  , nTrunc);.  }..
1ffb0 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74  sync_exit:.  ret
1ffc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1ffd0 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
1ffe0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1fff0 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
20000 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
20010 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
20020 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
20030 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
20040 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
20050 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
20060 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
20070 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
20080 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
20090 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
200a0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
200b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
200c0 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
200d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
200e0 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
200f0 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
20100 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
20110 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
20120 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
20130 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
20140 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
20150 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20160 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
20170 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
20180 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
20190 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
201a0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
201b0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
201c0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
201d0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
201e0 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
201f0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
20200 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
20210 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
20220 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  ;.      clearHis
20230 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
20240 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
20250 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
20260 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
20270 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
20280 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
20290 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
202a0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
202b0 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
202c0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
202d0 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
202e0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
202f0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
20300 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  = 0;.#ifndef NDE
20310 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
20320 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
20330 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
20340 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
20350 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
20360 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
20370 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
20380 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
20390 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
203a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
203b0 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
203c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
203d0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
203e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
203f0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
20400 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
20410 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
20420 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
20430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20440 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20450 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
20460 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
20470 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ache );.  assert
20480 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
20490 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
204a0 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
204b0 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70  ache );.  rc = p
204c0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
204d0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
204e0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
204f0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
20500 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
20510 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
20520 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
20530 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
20540 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
20550 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
20560 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
20570 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
20580 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
20590 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
205a0 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
205b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
205c0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
205d0 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
205e0 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
205f0 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
20600 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
20610 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
20620 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
20630 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
20640 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
20650 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
20660 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
20670 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
20680 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
20690 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
206a0 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
206b0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
206c0 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
206d0 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
206e0 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
206f0 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
20700 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
20710 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20720 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
20730 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
20740 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  c;.  PAGERTRACE2
20750 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
20760 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20770 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
20780 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
20790 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
207a0 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
207b0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
207c0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
207d0 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
207e0 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
207f0 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
20800 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
20810 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
20820 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
20830 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
20840 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
20850 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20860 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
20870 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
20880 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
20890 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
208a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
208b0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
208c0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
208d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
208e0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
208f0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
20900 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
20910 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
20920 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
20930 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  e);.        PAGE
20940 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43  RTRACE3("ROLLBAC
20950 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
20960 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
20970 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
20980 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20990 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
209a0 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
209b0 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
209c0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
209d0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
209e0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
209f0 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
20a00 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
20a10 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
20a20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
20a30 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
20a40 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
20a50 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
20a60 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
20a70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
20a80 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
20a90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
20aa0 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
20ab0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
20ac0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
20ad0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
20ae0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
20af0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
20b00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
20b10 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
20b20 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
20b30 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
20b40 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
20b50 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
20b60 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20b70 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
20b80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20b90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
20ba0 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
20bb0 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
20bc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
20bd0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
20be0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
20bf0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
20c00 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
20c10 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
20c20 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
20c30 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
20c40 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
20c50 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
20c60 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
20c70 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
20c80 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
20c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
20ca0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
20cb0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
20cc0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
20cd0 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
20ce0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
20cf0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20d00 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
20d10 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
20d20 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
20d30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20d40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20d50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
20d60 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
20d70 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
20d80 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
20d90 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61   0);.  }.  /* pa
20da0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
20db0 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  ); */.  pPager->
20dc0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
20dd0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
20de0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
20df0 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
20e00 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
20e10 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63  the pager.  ** c
20e20 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
20e30 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
20e40 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
20e50 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
20e60 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
20e70 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67   */.  return pag
20e80 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
20e90 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   rc);.}../*.** R
20ea0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
20eb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20ec0 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
20ed0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
20ee0 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
20ef0 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
20f00 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
20f10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20f20 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
20f30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
20f40 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
20f50 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
20f60 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
20f70 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
20f80 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
20f90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20fa0 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
20fb0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
20fc0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  urn pPager->nRef
20fd0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
20fe0 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
20ff0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
21000 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
21010 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
21020 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
21030 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
21040 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
21050 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
21060 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
21070 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
21080 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
21090 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
210a0 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
210b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
210c0 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
210d0 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
210e0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
210f0 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  e;.  a[6] = pPag
21100 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
21110 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
21120 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f  ;.  a[8] = 0;  /
21130 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61  * Used to be pPa
21140 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20  ger->nOvfl */.  
21150 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[9] = pPager->n
21160 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20  Read;.  a[10] = 
21170 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a  pPager->nWrite;.
21180 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65    return a;.}.#e
21190 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
211a0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  the statement ro
211b0 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a  llback point..**
211c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
211d0 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
211e0 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73  d with the trans
211f0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61  action journal a
21200 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20  lready.** open. 
21210 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   A new statement
21220 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61   journal is crea
21230 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20  ted that can be 
21240 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  used to rollback
21250 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61  .** changes of a
21260 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
21270 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72  and within a lar
21280 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ger transaction.
21290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
212a0 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61  agerStmtBegin(Pa
212b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
212c0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
212d0 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  ( !pPager->stmtI
212e0 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74  nUse );.  assert
212f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
21300 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
21310 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21320 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a  r->dbSize>=0 );.
21330 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
21340 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
21350 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21360 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
21370 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
21380 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
21390 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
213a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
213b0 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
213c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
213d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
213e0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
213f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
21400 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
21410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21420 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
21430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
21440 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
21450 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
21460 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
21470 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
21480 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
21490 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Stmt==0 ){.    /
214a0 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  * sqlite3OsLock(
214b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
214c0 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20  ED_LOCK); */.   
214d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
214e0 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
214f0 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
21500 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
21510 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
21520 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
21530 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
21540 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
21550 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
21560 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
21570 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ze == pPager->jo
21580 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64  urnalOff );.#end
21590 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  if.  pPager->stm
215a0 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
215b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
215c0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
215d0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
215e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
215f0 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
21600 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
21610 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
21620 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
21630 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
21640 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21650 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 70  PagerOpentemp(&p
21660 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
21670 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
21680 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
21690 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  d;.    pPager->s
216a0 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
216b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
216c0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
216d0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
216e0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
216f0 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
21700 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
21710 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
21720 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
21730 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
21740 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
21750 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
21760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
21780 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
21790 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
217a0 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65  rStmtCommit(Page
217b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
217c0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
217d0 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
217e0 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
217f0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
21800 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
21810 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21820 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
21830 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
21840 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
21850 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
21860 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
21870 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
21880 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  stfd, 0); */.   
21890 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
218a0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
218b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
218c0 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
218d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
218e0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
218f0 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
21900 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
21910 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
21920 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
21930 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
21940 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
21950 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
21960 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21970 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
21980 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
21990 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
219a0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
219b0 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
219c0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
219d0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
219e0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
219f0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
21a00 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
21a10 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
21a20 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
21a30 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21a40 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
21a50 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
21a60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
21a70 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
21a80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21a90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
21aa0 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
21ab0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
21ac0 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c  te3PagerStmtRoll
21ad0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
21ae0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
21af0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
21b00 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41  tInUse ){.    PA
21b10 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
21b20 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
21b30 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
21b40 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
21b50 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
21b60 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73  pPg;.      PgHis
21b70 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
21b80 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
21b90 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
21ba0 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  Pg=pHist->pNextS
21bb0 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48  tmt){.        pH
21bc0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
21bd0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
21be0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
21bf0 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
21c00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
21c10 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
21c20 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
21c30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21c40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
21c50 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
21c60 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
21c70 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
21c80 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
21c90 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
21ca0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
21cb0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
21cc0 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
21cd0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
21ce0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
21cf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
21d00 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
21d10 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
21d20 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
21d30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
21d40 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
21d50 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
21d60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21d70 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
21d80 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
21d90 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
21da0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21db0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
21dc0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21dd0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
21de0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
21df0 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
21e00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21e10 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
21e20 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
21e30 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
21e40 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
21e50 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
21e60 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21e70 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
21e80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21e90 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21ea0 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
21eb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21ec0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
21ed0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21ee0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
21ef0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
21f00 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
21f10 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21f20 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
21f30 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
21f40 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
21f50 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
21f60 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
21f70 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
21f80 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
21f90 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
21fa0 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
21fb0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
21fc0 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
21fd0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
21fe0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
21ff0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22000 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
22010 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
22020 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
22030 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22040 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
22050 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
22060 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
22070 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
22080 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
22090 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
220a0 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
220b0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
220c0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
220d0 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  cArg;.}.#endif..
220e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
220f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
22100 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
22110 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
22120 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
22130 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
22140 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
22150 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
22160 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
22170 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
22180 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
22190 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
221a0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
221b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
221c0 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
221d0 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
221e0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
221f0 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
22200 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
22210 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
22220 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
22230 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
22240 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
22250 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
22260 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
22270 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
22280 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
22290 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
222a0 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
222b0 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
222c0 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
222d0 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
222e0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
222f0 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
22300 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
22310 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
22320 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
22330 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
22340 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
22350 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
22360 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
22370 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
22380 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22390 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
223a0 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
223b0 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
223c0 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
223d0 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
223e0 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
223f0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
22400 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
22410 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e  s active)..*/.in
22420 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
22430 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
22440 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
22450 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
22460 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
22470 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
22480 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
22490 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
224a0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
224b0 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56  PAGERTRACE5("MOV
224c0 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
224d0 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
224e0 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
224f0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
22500 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
22510 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e  g->needSync, pgn
22520 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  o);.  IOTRACE(("
22530 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
22540 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
22550 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70  gno, pgno))..  p
22560 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
22570 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67  (pPg);.  if( pPg
22580 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
22590 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
225a0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
225b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
225c0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
225d0 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
225e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
225f0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
22600 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   );.  }..  /* Un
22610 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
22620 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  's hash-chain */
22630 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
22640 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
22650 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
22660 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
22670 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
22680 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
22690 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
226a0 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
226b0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
226c0 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
226d0 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
226e0 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
226f0 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
22700 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
22710 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
22720 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
22730 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
22740 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  /.  pPgOld = pag
22750 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
22760 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
22770 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73  PgOld ){.    ass
22780 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  ert( pPgOld->nRe
22790 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69  f==0 );.    unli
227a0 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
227b0 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20  er, pPgOld);.   
227c0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c   makeClean(pPgOl
227d0 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f  d);.    if( pPgO
227e0 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ld->needSync ){.
227f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
22800 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gOld->inJournal 
22810 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
22820 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
22830 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
22840 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   = 1;.      asse
22850 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
22860 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Sync );.    }.  
22870 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  }..  /* Change t
22880 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
22890 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
228a0 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
228b0 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
228c0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
228d0 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
228e0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
228f0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
22900 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
22910 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
22920 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22930 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
22940 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
22950 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
22960 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
22970 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
22980 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
22990 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
229a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
229b0 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
229c0 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
229d0 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
229e0 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
229f0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
22a00 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
22a10 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
22a20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
22a30 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
22a40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22a50 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
22a60 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
22a70 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
22a80 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
22a90 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
22aa0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
22ab0 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
22ac0 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
22ad0 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
22ae0 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
22af0 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75   ** Pager.aInJou
22b00 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65  rnal bit has bee
22b10 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
22b20 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
22b30 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20   by loading.    
22b40 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ** the page into
22b50 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
22b60 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
22b70 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
22b80 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
22b90 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
22ba0 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
22bb0 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
22bc0 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
22bd0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
22be0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
22bf0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
22c00 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
22c10 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
22c20 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
22c30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22c40 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
22c50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22c60 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
22c70 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
22c80 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
22c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
22ca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
22cb0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
22cc0 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65  ;.    pPgHdr->ne
22cd0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
22ce0 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgHdr->inJourna
22cf0 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
22d00 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
22d10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
22d20 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
22d30 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
22d40 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
22d50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
22d60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
22d70 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
22d80 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
22d90 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
22da0 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
22db0 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50  pPg){.  return P
22dc0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
22dd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
22de0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22df0 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
22e00 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
22e10 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
22e20 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
22e30 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
22e40 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
22e50 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
22e60 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
22e70 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22e80 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
22e90 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
22ea0 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  ?PGHDR_TO_EXTRA(
22eb0 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b  pPg, pPager):0);
22ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
22ed0 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
22ee0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
22ef0 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
22f00 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
22f10 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
22f20 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
22f30 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22f40 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
22f50 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22f60 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
22f70 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
22f80 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
22f90 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
22fa0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
22fb0 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
22fc0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
22fd0 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
22fe0 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
22ff0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
23000 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
23010 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
23020 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
23030 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
23040 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
23050 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
23060 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23070 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
23080 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
23090 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
230a0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
230b0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
230c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
230d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
230e0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
230f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
23100 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
23110 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
23120 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
23130 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23140 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
23150 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
23160 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
23170 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
23180 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
23190 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
231a0 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
231b0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
231c0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
231d0 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
231e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
231f0 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
23200 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20  iveMode;.}..#if 
23210 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
23220 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
23230 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
23240 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
23250 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
23260 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
23270 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
23280 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
23290 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
232a0 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
232b0 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
232c0 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
232d0 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
232e0 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
232f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
23300 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  kstate(Pager *pP
23310 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
23320 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61  sqlite3OsLockSta
23330 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  te(pPager->fd);.
23340 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
23350 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
23360 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
23370 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
23380 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
23390 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
233a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
233b0 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67  PagerRefdump(Pag
233c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
233d0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
233e0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
233f0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
23400 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
23410 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
23420 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23430 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
23440 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
23450 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
23460 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
23470 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
23480 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
23490 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
234a0 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
234b0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
234c0 2a 2f 0a                                         */.