/ Hex Artifact Content
Login

Artifact d3688828d314135ef0cd87b4d892805136c4168f:


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 31 36  : pager.c,v 1.16
0350: 36 20 32 30 30 34 2f 31 30 2f 30 32 20 32 30 3a  6 2004/10/02 20:
0360: 33 38 3a 32 38 20 64 72 68 20 45 78 70 20 24 0a  38:28 drh Exp $.
0370: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0380: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0390: 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75  de "os.h".#inclu
03a0: 64 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e  de "pager.h".#in
03b0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
03d0: 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  g.h>../*.** Macr
03e0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03f0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
0400: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
0410: 23 69 66 20 30 0a 23 64 65 66 69 6e 65 20 54 52  #if 0.#define TR
0420: 41 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71  ACE1(X)       sq
0430: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
0440: 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (X).#define TRAC
0450: 45 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69  E2(X,Y)     sqli
0460: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0470: 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,Y).#define TRAC
0480: 45 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c 69  E3(X,Y,Z)   sqli
0490: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
04a0: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52  ,Y,Z).#define TR
04b0: 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71  ACE4(X,Y,Z,W) sq
04c0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
04d0: 28 58 2c 59 2c 5a 2c 57 29 0a 23 65 6c 73 65 0a  (X,Y,Z,W).#else.
04e0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
04f0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0500: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0510: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66  ACE3(X,Y,Z).#def
0520: 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a  ine TRACE4(X,Y,Z
0530: 2c 57 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ,W).#endif.../*.
0540: 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68  ** The page cach
0550: 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20  e as a whole is 
0560: 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66  always in one of
0570: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0580: 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  * states:.**.** 
0590: 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20    PAGER_UNLOCK  
05a0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
05b0: 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72  ache is not curr
05c0: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
05d0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
05e0: 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69             writi
05f0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
0600: 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20  file.  There is 
0610: 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  no.**           
0620: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0630: 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e   held in memory.
0640: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e    This is the in
0650: 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  itial.**        
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0670: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  tate..**.**   PA
0680: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
0690: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
06a0: 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20   is reading the 
06b0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f     Writing is no
06e0: 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68  t permitted.  Th
06f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20  ere can be.**   
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61      multiple rea
0720: 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74  ders accessing t
0730: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
0740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0750: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61            file a
0760: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
0770: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52  .**.**   PAGER_R
0780: 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69  ESERVED      Thi
0790: 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65  s process has re
07a0: 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62  served the datab
07b0: 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a  ase for writing.
07c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
07d0: 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73           but has
07e0: 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e   not yet made an
07f0: 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79  y changes.  Only
0800: 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20   one process.** 
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20        at a time 
0830: 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20  can reserve the 
0840: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f  database.  The o
0850: 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
0880: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
0890: 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a  fied so other.**
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73         processes
08c0: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
08d0: 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73  ading the on-dis
08e0: 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  k.**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0900: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
0910: 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56    PAGER_EXCLUSIV
0920: 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63  E     The page c
0930: 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20  ache is writing 
0940: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73         Access is
0970: 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20   exclusive.  No 
0980: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
0990: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65              thre
09b0: 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ads can be readi
09c0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68  ng or writing wh
09d0: 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  ile one.**      
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
0a00: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ing..**.**   PAG
0a10: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20  ER_SYNCED       
0a20: 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73   The pager moves
0a30: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66   to this state f
0a40: 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rom PAGER_EXCLUS
0a50: 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  IVE.**          
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74               aft
0a70: 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  er all dirty pag
0a80: 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
0a90: 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20  tten to the.**  
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0ac0: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
0ad0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
0ae0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  to.**           
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0b00: 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69  . All that remai
0b10: 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72  ns to do is to r
0b20: 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20  emove the.**    
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
0b50: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0b60: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20  ion will be.**  
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a       committed..
0b90: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63  **.** The page c
0ba0: 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e  ache comes up in
0bb0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20   PAGER_UNLOCK.  
0bc0: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  The first time a
0bd0: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
0be0: 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  _get() occurs, t
0bf0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0c00: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0c10: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0c20: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0c30: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0c40: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0c50: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0c60: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0c70: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0c80: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0c90: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0ca0: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
0cb0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  () is called, th
0cc0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0cd0: 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  ons to.** PAGER_
0ce0: 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65  RESERVED.  (Note
0cf0: 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67   that sqlite_pag
0d00: 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e  e_write() can on
0d10: 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20  ly be.** called 
0d20: 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  on an outstandin
0d30: 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61  g page which mea
0d40: 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
0d50: 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20  r must.** be in 
0d60: 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66  PAGER_SHARED bef
0d70: 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f  ore it transitio
0d80: 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45  ns to PAGER_RESE
0d90: 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72  RVED.).** The tr
0da0: 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45  ansition to PAGE
0db0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75  R_EXCLUSIVE occu
0dc0: 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61  rs when before a
0dd0: 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ny changes.** ar
0de0: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61  e made to the da
0df0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66  tabase file.  Af
0e00: 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61  ter an sqlite3pa
0e10: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a  ger_rollback().*
0e20: 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65  * or sqlite_page
0e30: 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20  r_commit(), the 
0e40: 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20  state goes back 
0e50: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
0e60: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
0e70: 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a  R_UNLOCK      0.
0e80: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48  #define PAGER_SH
0e90: 41 52 45 44 20 20 20 20 20 20 31 0a 23 64 65 66  ARED      1.#def
0ea0: 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ine PAGER_RESERV
0eb0: 45 44 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20  ED    2.#define 
0ec0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0ed0: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
0ee0: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 34 0a  R_SYNCED      4.
0ef0: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d  ../*.** Each in-
0f00: 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
0f10: 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69  a page begins wi
0f20: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
0f30: 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73   header..** This
0f40: 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20   header is only 
0f50: 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20  visible to this 
0f60: 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54  pager module.  T
0f70: 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64  he client.** cod
0f80: 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67  e that calls pag
0f90: 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65  er sees only the
0fa0: 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
0fb0: 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  ws the header..*
0fc0: 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65  *.** Client code
0fd0: 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c   should call sql
0fe0: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
0ff0: 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f  ) on a page prio
1000: 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61  r to making.** a
1010: 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
1020: 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20   to that page.  
1030: 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73  The first time s
1040: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1050: 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  e().** is called
1060: 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  , the original p
1070: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1080: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1090: 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f  e rollback.** jo
10a0: 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e  urnal and PgHdr.
10b0: 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67  inJournal and Pg
10c0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65  Hdr.needSync are
10d0: 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e   set.  Later, on
10e0: 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ce.** the journa
10f0: 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20  l page has made 
1100: 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  it onto the disk
1110: 20 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e   surface, PgHdr.
1120: 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63  needSync.** is c
1130: 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64  leared.  The mod
1140: 69 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f  ified page canno
1150: 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63  t be written bac
1160: 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  k into the origi
1170: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1180: 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a  file until the j
1190: 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73  ournal pages has
11a0: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
11b0: 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20  disk and the.** 
11c0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68  PgHdr.needSync h
11d0: 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e  as been cleared.
11e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72  .**.** The PgHdr
11f0: 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73  .dirty flag is s
1200: 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70  et when sqlite3p
1210: 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
1220: 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73  called and.** is
1230: 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77   cleared again w
1240: 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e  hen the page con
1250: 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20  tent is written 
1260: 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67  back to the orig
1270: 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  inal.** database
1280: 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65   file..*/.typede
1290: 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50  f struct PgHdr P
12a0: 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48  gHdr;.struct PgH
12b0: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
12c0: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
12d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
12e0: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
12f0: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
1300: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
1330: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
1340: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
1350: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
1360: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
1370: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
1380: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
1390: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46  .  PgHdr *pNextF
13a0: 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b  ree, *pPrevFree;
13b0: 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66    /* Freelist of
13c0: 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
13d0: 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  f==0 */.  PgHdr 
13e0: 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20  *pNextAll;      
13f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69           /* A li
1400: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
1410: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1420: 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d  tStmt, *pPrevStm
1430: 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70  t;  /* List of p
1440: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
1450: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ement journal */
1460: 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b  .  u8 inJournal;
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73    /* TRUE if has
1490: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
14a0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
14b0: 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20   inStmt;        
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14d0: 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73  TRUE if in the s
14e0: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
14f0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
1500: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1510: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1520: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1530: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1540: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1550: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1560: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1570: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1580: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1590: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
15a0: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
15b0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e    /* Disable don
15c0: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
15d0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
15e0: 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20  short int nRef; 
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1600: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  * Number of user
1610: 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a  s of this page *
1620: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
1630: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1640: 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65     /* Dirty page
1650: 73 20 73 6f 72 74 65 64 20 62 79 20 50 67 48 64  s sorted by PgHd
1660: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 70  r.pgno */.  /* p
1670: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1680: 62 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61  bytes of page da
1690: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68  ta follow this h
16a0: 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61  eader */.  /* Pa
16b0: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
16c0: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66   of local data f
16d0: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64  ollow the page d
16e0: 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ata */.};../*.**
16f0: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
1700: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
1710: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
1720: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
1730: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
1740: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
1750: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
1760: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
1770: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
1780: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
1790: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
17a0: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
17b0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
17c0: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
17d0: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
17e0: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
17f0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1800: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
1810: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
1820: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
1830: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
1840: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
1850: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
1860: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
1870: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
1880: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
1890: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
18a0: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
18b0: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
18c0: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
18d0: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
18e0: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
18f0: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
1900: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
1910: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
1920: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1930: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
1940: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
1950: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
1960: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
1970: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
1980: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
1990: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
19a0: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
19b0: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
19c0: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
19d0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
19e0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
19f0: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ment */.};../*.*
1a00: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
1a10: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
1a20: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
1a30: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
1a40: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1a50: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
1a60: 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e  P,D,N,X) if( P->
1a70: 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f  xCodec ){ P->xCo
1a80: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
1a90: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65  ,D,N,X); }.#else
1aa0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
1ab0: 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a  P,D,N,X).#endif.
1ac0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1ad0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
1ae0: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
1af0: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
1b00: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
1b10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
1b20: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28  DR_TO_DATA(P)  (
1b30: 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29  (void*)(&(P)[1])
1b40: 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54  ).#define DATA_T
1b50: 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28  O_PGHDR(D)  (&((
1b60: 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29  PgHdr*)(D))[-1])
1b70: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
1b80: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
1b90: 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26  oid*)&((char*)(&
1ba0: 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61  (G)[1]))[(P)->pa
1bb0: 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65  geSize]).#define
1bc0: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50   PGHDR_TO_HIST(P
1bd0: 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20  ,PGR)  \.       
1be0: 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79       ((PgHistory
1bf0: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
1c00: 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67  [1]))[(PGR)->pag
1c10: 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78  eSize+(PGR)->nEx
1c20: 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77  tra])../*.** How
1c30: 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68 65   big to make the
1c40: 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65 64   hash table used
1c50: 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69 6e   for locating in
1c60: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a 2a  -memory pages.**
1c70: 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e   by page number.
1c80: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47  .*/.#define N_PG
1c90: 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a  _HASH 2048../*.*
1ca0: 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e 75  * Hash a page nu
1cb0: 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mber.*/.#define 
1cc0: 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20  pager_hash(PN)  
1cd0: 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48  ((PN)&(N_PG_HASH
1ce0: 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  -1))../*.** A op
1cf0: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
1d00: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1d10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1d20: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
1d30: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68 61  ct Pager {.  cha
1d40: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
1d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1d60: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d70: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
1d80: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
1d90: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1da0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1db0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
1dc0: 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20  irectory;       
1dd0: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
1de0: 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61   hold database a
1df0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nd journal files
1e00: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64 2c   */.  OsFile fd,
1e10: 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20   jfd;           
1e20: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
1e30: 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61  ptors for databa
1e40: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a  se and journal *
1e50: 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64 3b  /.  OsFile stfd;
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1e80: 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  or for the state
1e90: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a  ment subjournal*
1ea0: 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20  /.  int dbSize; 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1ed0: 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a  es in the file *
1ee0: 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69  /.  int origDbSi
1ef0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1f00: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
1f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
1f20: 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  nge */.  int stm
1f30: 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  tSize;          
1f40: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1f50: 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67  database (in pag
1f60: 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69  es) at stmt_begi
1f70: 6e 28 29 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  n() */.  i64 stm
1f80: 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  tJSize;         
1f90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1fa0: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
1fb0: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
1fc0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fe0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
1ff0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2000: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
2010: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
2020: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
2030: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
2040: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
2050: 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e  m */.  int stmtN
2060: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2070: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2080: 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20  records in stmt 
2090: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  subjournal */.  
20a0: 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20  int nExtra;     
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
20d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
20e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 76  mory page */.  v
20f0: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
2100: 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f  r)(void*,int); /
2110: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
2120: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
2130: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
2140: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76 6f   (*xReiniter)(vo
2150: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43  id*,int);   /* C
2160: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
2170: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
2180: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 70  pages */.  int p
2190: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
21a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21b0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
21c0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  age */.  int nPa
21d0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
21e0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
21f0: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
2200: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  y pages */.  int
2210: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2230: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
2240: 70 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72  pages with PgHdr
2250: 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74  .nRef>0 */.  int
2260: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2280: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
2290: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
22a0: 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  ache */.  int nH
22b0: 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c  it, nMiss, nOvfl
22c0: 3b 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68  ;     /* Cache h
22d0: 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e  its, missing, an
22e0: 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20  d LRU overflows 
22f0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
2300: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
2310: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
2320: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
2330: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
2340: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
2350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2360: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
2370: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 75   xCodec() */.  u
2380: 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20  8 journalOpen;  
2390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
23a0: 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ue if journal fi
23b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69  le descriptors i
23c0: 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20  s valid */.  u8 
23d0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20  journalStarted; 
23e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
23f0: 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f   if header of jo
2400: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2410: 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e  */.  u8 useJourn
2420: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2430: 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61   /* Use a rollba
2440: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ck journal on th
2450: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  is file */.  u8 
2460: 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20  stmtOpen;       
2470: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2480: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
2490: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20  t subjournal is 
24a0: 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d  open */.  u8 stm
24b0: 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20  tInUse;         
24c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65        /* True we
24d0: 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d   are in a statem
24e0: 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
24f0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41  on */.  u8 stmtA
2500: 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20  utoopen;        
2510: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74      /* Open stmt
2520: 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61   journal when ma
2530: 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  in journal is op
2540: 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ened*/.  u8 noSy
2550: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2560: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
2570: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2580: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
2590: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
25a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
25b0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
25c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
25d0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
25e0: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
25f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2600: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2610: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2620: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d  tc. */.  u8 errM
2630: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
2640: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
2650: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
2660: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74  errors */.  u8 t
2670: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20  empFile;        
2680: 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2690: 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72  name is a tempor
26a0: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ary file */.  u8
26b0: 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20   readOnly;      
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
26d0: 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
26e0: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
26f0: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
2700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2710: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
2720: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
2730: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2740: 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20  u8 dirtyCache;  
2750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2760: 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61  rue if cached pa
2770: 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  ges have changed
2780: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2790: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
27a0: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e    /* Disable don
27b0: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
27c0: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
27d0: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27f0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
2800: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
2810: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2830: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2840: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2850: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2860: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2880: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2890: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
28a0: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 73 65 74  base */.  u8 set
28b0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
28c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
28d0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
28e0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28f0: 6a 72 6e 6c 20 2a 2f 0a 20 20 42 75 73 79 48 61  jrnl */.  BusyHa
2900: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
2910: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
2920: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
2930: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64  andler */.  PgHd
2940: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
2950: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
2960: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
2970: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
2980: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
2990: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
29a0: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
29b0: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
29c0: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
29d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
29e0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
29f0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
2a00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a10: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
2a20: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
2a30: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
2a40: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
2a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a60: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
2a70: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
2a80: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
2a90: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2ab0: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
2ac0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
2ad0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
2ae0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
2af0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
2b00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
2b10: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
2b20: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
2b30: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
2b40: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
2b50: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
2b60: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
2b70: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
2b80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b90: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
2ba0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
2bb0: 62 61 63 6b 20 2a 2f 0a 20 20 50 67 48 64 72 20  back */.  PgHdr 
2bc0: 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48  *aHash[N_PG_HASH
2bd0: 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61  ];    /* Hash ta
2be0: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
2bf0: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
2c00: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
2c10: 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74  se are bits that
2c20: 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50   can be set in P
2c30: 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f  ager.errMask..*/
2c40: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
2c50: 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31  RR_FULL     0x01
2c60: 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66    /* a write() f
2c70: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
2c80: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20   PAGER_ERR_MEM  
2c90: 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c      0x02  /* mal
2ca0: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  loc() failed */.
2cb0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
2cc0: 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20  R_LOCK     0x04 
2cd0: 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65   /* error in the
2ce0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
2cf0: 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  l */.#define PAG
2d00: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20  ER_ERR_CORRUPT  
2d10: 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73  0x08  /* databas
2d20: 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  e or journal cor
2d30: 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69  ruption */.#defi
2d40: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  ne PAGER_ERR_DIS
2d50: 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67  K     0x10  /* g
2d60: 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20  eneral disk I/O 
2d70: 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64  error - bad hard
2d80: 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a   drive? */../*.*
2d90: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
2da0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
2db0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
2dc0: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
2dd0: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
2de0: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
2df0: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
2e00: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
2e10: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
2e20: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
2e30: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
2e40: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
2e50: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
2e60: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
2e70: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
2e80: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
2e90: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
2ea0: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
2eb0: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
2ec0: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
2ed0: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
2ee0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
2ef0: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
2f00: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
2f10: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
2f20: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
2f30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
2f40: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
2f50: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
2f60: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
2f70: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
2f80: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
2f90: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
2fa0: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
2fb0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
2fc0: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
2fd0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
2fe0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
2ff0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
3000: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
3010: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
3020: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
3030: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
3040: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
3050: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
3060: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
3070: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
3080: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3090: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
30a0: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
30b0: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
30c0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
30d0: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
30e0: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
30f0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3100: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
3110: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
3120: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
3130: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
3140: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
3150: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
3160: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
3170: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
3180: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
3190: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
31a0: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
31b0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
31c0: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
31d0: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
31e0: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
31f0: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
3200: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
3210: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
3220: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
3230: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
3240: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
3250: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
3260: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
3270: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
3280: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
3290: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
32a0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
32b0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
32c0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
32d0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
32e0: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
32f0: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
3300: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
3310: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
3320: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
3330: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
3340: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
3350: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
3360: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
3370: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3380: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
3390: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
33a0: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
33b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
33c0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
33d0: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
33e0: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
33f0: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
3400: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
3410: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
3420: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
3430: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
3440: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
3450: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
3460: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
3470: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
3480: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
3490: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
34a0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 23 64  >sectorSize)..#d
34b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 45 43 54  efine PAGER_SECT
34c0: 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a 2f 2a 0a  OR_SIZE 512../*.
34d0: 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50  ** Page number P
34e0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20  AGER_MJ_PGNO is 
34f0: 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e  never used in an
3500: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
3510: 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72   (it is.** reser
3520: 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ved for working 
3530: 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73  around a windows
3540: 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69  /posix incompati
3550: 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a  bility). It is.*
3560: 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f  * used in the jo
3570: 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79  urnal to signify
3580: 20 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e   that the remain
3590: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
35a0: 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64  al file .** is d
35b0: 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e  evoted to storin
35c0: 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
35d0: 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20  al name - there 
35e0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65  are no more page
35f0: 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63  s to.** roll bac
3600: 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  k. See comments 
3610: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  for function wri
3620: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
3630: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
3640: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3650: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
3660: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
3670: 61 67 65 53 69 7a 65 29 29 0a 0a 2f 2a 0a 2a 2a  ageSize))../*.**
3680: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
3690: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
36a0: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
36b0: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
36c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
36d0: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
36e0: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
36f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
3700: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
3710: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
3720: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
3730: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
3740: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
3750: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
3760: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
3770: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
3780: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
3790: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e  d\n",.       p->
37a0: 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
37b0: 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a  ATA(p), p->nRef.
37c0: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
37d0: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
37e0: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
37f0: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
3800: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
3810: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
3820: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
3830: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
3840: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
3850: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
3860: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
3870: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
3880: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
3890: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
38a0: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
38b0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
38c0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
38d0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
38e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
38f0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3900: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
3910: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
3920: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
3930: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
3940: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
3950: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
3960: 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20 72   *pRes){.  u32 r
3970: 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  es;.  int rc;.  
3980: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
3990: 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69 7a  ad(fd, &res, siz
39a0: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66 28  eof(res));.  if(
39b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
39c0: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  {.    unsigned c
39d0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20 6d  har ac[4];.    m
39e0: 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c 20  emcpy(ac, &res, 
39f0: 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28 61  4);.    res = (a
3a00: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
3a10: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
3a20: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20 20  <<8) | ac[3];.  
3a30: 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73 3b  }.  *pRes = res;
3a40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3a50: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
3a60: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
3a70: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
3a80: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
3a90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
3aa0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
3ab0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
3ac0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
3ad0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
3ae0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
3af0: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
3b00: 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e  2 val){.  unsign
3b10: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
3b20: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
3b30: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  4) & 0xff;.  ac[
3b40: 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  1] = (val>>16) &
3b50: 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d   0xff;.  ac[2] =
3b60: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
3b70: 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20  ;.  ac[3] = val 
3b80: 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72 6e  & 0xff;.  return
3b90: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
3ba0: 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f  fd, ac, 4);.}../
3bb0: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 33  *.** Write the 3
3bc0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 27 76  2-bit integer 'v
3bd0: 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70 61 67  al' into the pag
3be0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
3bf0: 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a 20 27  page header.** '
3c00: 70 27 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  p' at offset 'of
3c10: 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  fset'..*/.static
3c20: 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74   void store32bit
3c30: 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72  s(u32 val, PgHdr
3c40: 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29   *p, int offset)
3c50: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
3c60: 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28  r *ac;.  ac = &(
3c70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
3c80: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
3c90: 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63 5b  )[offset];.  ac[
3ca0: 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26  0] = (val>>24) &
3cb0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d   0xff;.  ac[1] =
3cc0: 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66   (val>>16) & 0xf
3cd0: 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61  f;.  ac[2] = (va
3ce0: 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20  l>>8) & 0xff;.  
3cf0: 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78  ac[3] = val & 0x
3d00: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  ff;.}../*.** Rea
3d10: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
3d20: 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66  er at offset 'of
3d30: 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20 70  fset' from the p
3d40: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
3d50: 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65 72  y.** page header
3d60: 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   'p'..*/.static 
3d70: 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62 69  u32 retrieve32bi
3d80: 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e 74  ts(PgHdr *p, int
3d90: 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69   offset){.  unsi
3da0: 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20  gned char *ac;. 
3db0: 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65   ac = &((unsigne
3dc0: 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  d char*)PGHDR_TO
3dd0: 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74  _DATA(p))[offset
3de0: 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63 5b  ];.  return (ac[
3df0: 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31 5d  0]<<24) | (ac[1]
3e00: 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c 3c  <<16) | (ac[2]<<
3e10: 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a 0a  8) | ac[3];.}...
3e20: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
3e30: 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70 50  e bits in the pP
3e40: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69 6e  ager->errMask in
3e50: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74 65  to an approprate
3e60: 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  .** return code.
3e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
3e80: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61 67  ager_errcode(Pag
3e90: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
3ea0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
3eb0: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
3ec0: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
3ed0: 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20 72  _ERR_LOCK )    r
3ee0: 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  c = SQLITE_PROTO
3ef0: 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  COL;.  if( pPage
3f00: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
3f10: 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20 20  ER_ERR_DISK )   
3f20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
3f30: 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  RR;.  if( pPager
3f40: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
3f50: 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20 20  R_ERR_FULL )    
3f60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
3f70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
3f80: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
3f90: 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72 63  ERR_MEM )     rc
3fa0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
3fb0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
3fc0: 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45  rrMask & PAGER_E
3fd0: 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63 20  RR_CORRUPT ) rc 
3fe0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
3ff0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4000: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
4010: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
4020: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
4030: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
4040: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
4050: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
4060: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
4070: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
4080: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
4090: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
40a0: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
40b0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
40c0: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
40d0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
40e0: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
40f0: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
4100: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
4110: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
4120: 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73  iteFree() *pzMas
4130: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ter..**.** If no
4140: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4150: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
4160: 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69  sent *pzMaster i
4170: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
4180: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
4190: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
41a0: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
41b0: 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a  urnal(OsFile *pJ
41c0: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
41d0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
41e0: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
41f0: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
4200: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
4210: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
4220: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
4230: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
4240: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
4250: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
4260: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4270: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
4280: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
4290: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
42a0: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
42b0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
42c0: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
42d0: 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28  , szJ-16);.  if(
42e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
42f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20   return rc;. .  
4300: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
4310: 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20  pJrnl, &len);.  
4320: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4330: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4340: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
4350: 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29  s(pJrnl, &cksum)
4360: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4370: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
4380: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
4390: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
43a0: 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66  aMagic, 8);.  if
43b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
43c0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
43d0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
43e0: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
43f0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
4400: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
4410: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
4420: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4430: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a   return rc;..  *
4440: 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72  pzMaster = (char
4450: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
4460: 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a  len+1);.  if( !*
4470: 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  pzMaster ){.    
4480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
4490: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
44a0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
44b0: 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20  rnl, *pzMaster, 
44c0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
44d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
44e0: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
44f0: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
4500: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
4510: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
4520: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
4530: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
4540: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
4550: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
4560: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
4570: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
4580: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a  (*pzMaster)[i];.
4590: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
45a0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
45b0: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
45c0: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
45d0: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
45e0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
45f0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
4600: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
4610: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
4620: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
4630: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
4640: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
4650: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
4660: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
4670: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
4680: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
4690: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
46a0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
46b0: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
46c0: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
46d0: 20 30 3b 0a 20 20 7d 0a 20 20 28 2a 70 7a 4d 61   0;.  }.  (*pzMa
46e0: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
46f0: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
4700: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4710: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
4720: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
4730: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
4740: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
4750: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
4760: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
4770: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
4780: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
4790: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
47a0: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
47b0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
47c0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
47d0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
47e0: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
47f0: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
4800: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
4810: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
48a0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
48b0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
48c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
48d0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
48e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
48f0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
4900: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
4910: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
4920: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
4930: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
4940: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4950: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
4960: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4970: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4980: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
4990: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
49a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
49b0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
49c0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
49d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
49e0: 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67  Pager) );.  pPag
49f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
4a00: 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72   offset;.  retur
4a10: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  n sqlite3OsSeek(
4a20: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
4a30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
4a40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
4a50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
4a60: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
4a70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4a80: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
4a90: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
4aa0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
4ab0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
4ac0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
4ad0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
4ae0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
4af0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
4b00: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
4b10: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
4b20: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
4b30: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
4b40: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
4b50: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
4b60: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
4b70: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
4b80: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
4b90: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
4ba0: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
4bb0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
4bc0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
4bd0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
4be0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
4bf0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
4c00: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
4c10: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
4c20: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
4c30: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
4c40: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
4c50: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
4c60: 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20   - 24) bytes of 
4c70: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
4c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
4c90: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
4ca0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 69  r *pPager){..  i
4cb0: 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  nt rc = seekJour
4cc0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
4cd0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
4ce0: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
4cf0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
4d00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
4d10: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4d20: 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b  stmtHdrOff==0 ){
4d30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
4d40: 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  tHdrOff = pPager
4d50: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20  ->journalHdr;.  
4d60: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
4d70: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
4d80: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
4d90: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
4da0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
4db0: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
4dc0: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
4dd0: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
4de0: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
4df0: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
4e00: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
4e10: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
4e20: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
4e30: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
4e40: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
4e50: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
4e60: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
4e70: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
4e80: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
4e90: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
4ea0: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63   this..  */.  rc
4eb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
4ec0: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
4ed0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
4ee0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
4ef0: 67 69 63 29 29 3b 0a 0a 20 20 69 66 28 20 72 63  gic));..  if( rc
4f00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4f10: 20 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46     /* The nRec F
4f20: 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46  ield. 0xFFFFFFFF
4f30: 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75   for no-sync jou
4f40: 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63  rnals. */.    rc
4f50: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
4f60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
4f70: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78  ger->noSync ? 0x
4f80: 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20  ffffffff : 0);. 
4f90: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4fa0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
4fb0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
4fc0: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
4fd0: 65 72 20 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74  er */ .    sqlit
4fe0: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
4ff0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
5000: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
5010: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20  >cksumInit);.   
5020: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
5030: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5040: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
5050: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
5060: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5070: 20 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61     /* The initia
5080: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
5090: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
50a0: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
50b0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62  >jfd, pPager->db
50c0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Size);.  }.  if(
50d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
50e0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73  {.    /* The ass
50f0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
5100: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
5110: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  s */.    rc = wr
5120: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5130: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5140: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 7d  sectorSize);.  }
5150: 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e  ..  /* The journ
5160: 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65  al header has be
5170: 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65  en written succe
5180: 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68  ssfully. Seek th
5190: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
51a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
51b0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
51c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
51d0: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  sector..  */.  i
51e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
51f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
5200: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
5210: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
5220: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 72  nalOff-1);.    r
5230: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
5240: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
5250: 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d   "\000", 1);.  }
5260: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5270: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5280: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
5290: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
52a0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
52b0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
52c0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
52d0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
52e0: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
52f0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
5300: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
5310: 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  le. See comments
5320: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
5330: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
5340: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
5350: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f  ion of.** the jo
5360: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
5370: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
5380: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
5390: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
53a0: 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  nRec is set to t
53b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
53c0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
53d0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
53e0: 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69  er and *dbSize i
53f0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
5400: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
5410: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
5420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
5430: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
5440: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
5450: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
5460: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
5470: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
5480: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
5490: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
54a0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
54b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
54c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
54d0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
54e0: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
54f0: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
5500: 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20  urned and *nRec 
5510: 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20  and *dbSize are 
5520: 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55  not set.  If JOU
5530: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
5540: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
5550: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
5560: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
5570: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
5580: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
5590: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
55a0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
55b0: 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e  er, .  i64 journ
55c0: 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70  alSize,.  u32 *p
55d0: 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44  NRec, .  u32 *pD
55e0: 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72  bSize.){.  int r
55f0: 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
5600: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
5610: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
5620: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
5630: 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65  er */..  rc = se
5640: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
5650: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ger);.  if( rc )
5660: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
5670: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
5680: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
5690: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
56a0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
56b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
56c0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
56d0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
56e0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  &pPager->jfd, aM
56f0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
5700: 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20  gic));.  if( rc 
5710: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5720: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
5730: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
5740: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
5750: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
5760: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
5770: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
5780: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
5790: 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  jfd, pNRec);.  i
57a0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
57b0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
57c0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
57d0: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
57e0: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
57f0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
5800: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5810: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5820: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
5830: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
5840: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
5850: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
5860: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
5870: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
5880: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
5890: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
58a0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
58b0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
58c0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
58d0: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
58e0: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
58f0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
5900: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
5910: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
5920: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
5930: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
5940: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
5950: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
5960: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
5970: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
5980: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
5990: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50  = read32bits(&pP
59a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
59b0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
59c0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
59d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
59e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
59f0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
5a00: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
5a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5a20: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
5a30: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
5a40: 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  lOff);.  return 
5a50: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
5a60: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
5a70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5a80: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
5a90: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
5aa0: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
5ab0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
5ac0: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
5ad0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
5ae0: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
5af0: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
5b00: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
5b10: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
5b20: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
5b30: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
5b40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
5b50: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
5b60: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
5b70: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
5b80: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
5b90: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
5ba0: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
5bb0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
5bc0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
5bd0: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
5be0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
5bf0: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
5c00: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
5c10: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
5c20: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
5c30: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
5c40: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
5c50: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
5c60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
5c70: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
5c80: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
5c90: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
5ca0: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
5cb0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5cc0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
5cd0: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
5ce0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
5cf0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
5d00: 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20  c;.  int len; . 
5d10: 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63   int i; .  u32 c
5d20: 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66  ksum = 0; ..  if
5d30: 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50  ( !zMaster || pP
5d40: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
5d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5d60: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  K;.  pPager->set
5d70: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c  Master = 1;..  l
5d80: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73  en = strlen(zMas
5d90: 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ter);.  for(i=0;
5da0: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
5db0: 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74    cksum += zMast
5dc0: 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  er[i];.  }..  /*
5dd0: 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
5de0: 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74   mode, advance t
5df0: 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20  o the next disk 
5e00: 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72  sector before wr
5e10: 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  iting.  ** the m
5e20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5e30: 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63  me. This is in c
5e40: 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
5e50: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f   page written to
5e60: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
5e70: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  l has already be
5e80: 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a  en synced..  */.
5e90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
5ea0: 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  llSync ){.    rc
5eb0: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5ec0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
5ed0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5ee0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
5ef0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
5f00: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32  nalOff += (len+2
5f10: 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  0);..  rc = writ
5f20: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
5f30: 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  >jfd, PAGER_MJ_P
5f40: 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
5f50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5f60: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5f70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5f80: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
5f90: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
5fa0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5fb0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5fc0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  rc;..  rc = writ
5fd0: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
5fe0: 3e 6a 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66  >jfd, len);.  if
5ff0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6000: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6010: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
6020: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63  (&pPager->jfd, c
6030: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
6040: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6050: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6060: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
6070: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
6080: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6090: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
60a0: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  ));.  pPager->ne
60b0: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 72 65  edSync = 1;.  re
60c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
60d0: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
60e0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
60f0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
6100: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
6110: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
6120: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
6130: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
6140: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
6150: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
6160: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
6170: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
6180: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
6190: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61  ps the sqlite3pa
61a0: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
61b0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e  ).** routine run
61c0: 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72   MUCH faster for
61d0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
61e0: 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
61f0: 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69   many.** pages i
6200: 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c  n memory but onl
6210: 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74  y a few are in t
6220: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
6230: 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
6240: 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f  void page_add_to
6250: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
6260: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
6270: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
6280: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67  Pager;.  if( pPg
6290: 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72  ->inStmt ) retur
62a0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  n;.  assert( pPg
62b0: 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26  ->pPrevStmt==0 &
62c0: 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  & pPg->pNextStmt
62d0: 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50  ==0 );.  pPg->pP
62e0: 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  revStmt = 0;.  i
62f0: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
6300: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
6310: 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  pStmt->pPrevStmt
6320: 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
6330: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  g->pNextStmt = p
6340: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20  Pager->pStmt;.  
6350: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
6360: 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  pPg;.  pPg->inSt
6370: 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63  mt = 1;.}.static
6380: 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76   void page_remov
6390: 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
63a0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
63b0: 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74  if( !pPg->inStmt
63c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
63d0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
63e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
63f0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70  Pg->pPrevStmt->p
6400: 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b  NextStmt==pPg );
6410: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53  .    pPg->pPrevS
6420: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  tmt->pNextStmt =
6430: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
6440: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
6450: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
6460: 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b  r->pStmt==pPg );
6470: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
6480: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  ->pStmt = pPg->p
6490: 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  NextStmt;.  }.  
64a0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  if( pPg->pNextSt
64b0: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
64c0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
64d0: 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67  ->pPrevStmt==pPg
64e0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   );.    pPg->pNe
64f0: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
6500: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74  t = pPg->pPrevSt
6510: 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  mt;.  }.  pPg->p
6520: 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
6530: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
6540: 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d   0;.  pPg->inStm
6550: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
6560: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
6570: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
6580: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
6590: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
65a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
65b0: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
65c0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
65d0: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
65e0: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
65f0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
6600: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20  no){.  PgHdr *p 
6610: 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
6620: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
6630: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
6640: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
6650: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
6660: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
6670: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
6680: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
6690: 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74  base and clear t
66a0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
66b0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
66c0: 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74  e.** sets the st
66d0: 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
66e0: 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74   back to what it
66f0: 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73   was when it was
6700: 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64   first.** opened
6710: 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69  .  Any outstandi
6720: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
6730: 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62  alidated and sub
6740: 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73  sequent attempts
6750: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
6760: 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c  ose pages will l
6770: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
6780: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73  a coredump..*/.s
6790: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
67a0: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
67b0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
67c0: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66  pPg, *pNext;.  f
67d0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
67e0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
67f0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
6800: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
6810: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
6820: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  pPg);.  }.  pPag
6830: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
6840: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
6850: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
6860: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
6870: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
6880: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50  = 0;.  memset(pP
6890: 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
68a0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
68b0: 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72  Hash));.  pPager
68c0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  ->nPage = 0;.  i
68d0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
68e0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
68f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70   ){.    sqlite3p
6900: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
6910: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
6920: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
6930: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
6940: 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  K);.  pPager->st
6950: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
6960: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  CK;.  pPager->db
6970: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61  Size = -1;.  pPa
6980: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
6990: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
69a0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
69b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  );.}../*.** When
69c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
69d0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
69e0: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
69f0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
6a00: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
6a10: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
6a20: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
6a30: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
6a40: 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20  releases.** the 
6a50: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
6a60: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
6a70: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
6a80: 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72  place.  The jour
6a90: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64  nal.** file is d
6aa0: 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  eleted and close
6ab0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
6ac0: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
6ad0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6ae0: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
6af0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
6b00: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
6b10: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
6b20: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
6b30: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
6b40: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
6b50: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
6b60: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
6b70: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e  tic int pager_un
6b80: 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20  writelock(Pager 
6b90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
6ba0: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
6bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ;.  assert( !pPa
6bc0: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20  ger->memDb );.  
6bd0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
6be0: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
6bf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6c00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
6c10: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
6c20: 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
6c30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
6c40: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
6c50: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
6c60: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
6c70: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
6c80: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  pen = 0;.  }.  i
6c90: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
6ca0: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
6cb0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
6cc0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
6cd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6ce0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  pen = 0;.    sql
6cf0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
6d00: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
6d10: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
6d20: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
6d30: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
6d40: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
6d50: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
6d60: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
6d70: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
6d80: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
6d90: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
6da0: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
6db0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
6dc0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
6dd0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
6de0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
6df0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
6e00: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
6e10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
6e20: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
6e30: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   || pPager->useJ
6e40: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ournal==0 );.  }
6e50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6e60: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
6e70: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
6e80: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
6e90: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
6ea0: 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69  D;.  pPager->ori
6eb0: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  gDbSize = 0;.  p
6ec0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
6ed0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
6ee0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
6ef0: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
6f00: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
6f10: 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a  e page of data..
6f20: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
6f30: 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
6f40: 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79  m.  It is really
6f50: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
6f60: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
6f70: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e  initial value an
6f80: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
6f90: 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e  r.  We experimen
6fa0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68  ted with.** a ch
6fb0: 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e  ecksum of the en
6fc0: 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74  tire data, but t
6fd0: 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f  hat was found to
6fe0: 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a   be too slow..**
6ff0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
7000: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
7010: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62   stored at the b
7020: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
7030: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63   and.** the chec
7040: 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61  ksum is stored a
7050: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73  t the end.  This
7060: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
7070: 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  If journal.** co
7080: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
7090: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
70a0: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
70b0: 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f   likely scenario
70c0: 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20  .** is that one 
70d0: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
70e0: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
70f0: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
7100: 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c   It is.** much l
7110: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
7120: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
7130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
7140: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
7150: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
7160: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
7170: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
7180: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
7190: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
71a0: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
71b0: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
71c0: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
71d0: 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ruption..**.** F
71e0: 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72  IX ME:  Consider
71f0: 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30   adding every 20
7200: 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65  0th (or so) byte
7210: 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20   of the data to 
7220: 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e  the.** checksum.
7230: 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20    That way if a 
7240: 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e  single page span
7250: 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b  s 3 or more disk
7260: 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20   sectors and.** 
7270: 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20  only the middle 
7280: 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70  sector is corrup
7290: 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c  t, we will still
72a0: 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62   have a reasonab
72b0: 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20  le.** chance of 
72c0: 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63  failing the chec
72d0: 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65  ksum and thus de
72e0: 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62  tecting the prob
72f0: 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lem..*/.static u
7300: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
7310: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
7320: 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63  no pgno, const c
7330: 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20 75  har *aData){.  u
7340: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
7350: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
7360: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
7370: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
7380: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
7390: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
73a0: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
73b0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
73c0: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
73d0: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
73e0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
73f0: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
7400: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
7410: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
7420: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
7430: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
7440: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
7450: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
7460: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
7470: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
7480: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
7490: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
74a0: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
74b0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
74c0: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
74d0: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
74e0: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
74f0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
7500: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
7510: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
7520: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69  , OsFile *jfd, i
7530: 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20  nt useCksum){.  
7540: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
7550: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
7560: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
7570: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
7580: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
7590: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
75b0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
75c0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
75d0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
75e0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
75f0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
7600: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
7610: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
7620: 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45   u8 aData[SQLITE
7630: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  _MAX_PAGE_SIZE];
7640: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
7650: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
7660: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7670: 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a  ts(jfd, &pgno);.
7680: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7690: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
76a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
76b0: 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74  sRead(jfd, &aDat
76c0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
76d0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
76e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
76f0: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
7700: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
7710: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
7720: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
7730: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
7740: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
7750: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
7760: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
7770: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
7780: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
7790: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
77a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
77b0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
77c0: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
77d0: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
77e0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
77f0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
7800: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
7810: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
7820: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
7830: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
7840: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
7850: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
7860: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
7870: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
7880: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
7890: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
78a0: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
78b0: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
78c0: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
78d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
78e0: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
78f0: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
7900: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
7910: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
7920: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
7930: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
7940: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
7950: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
7960: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44  pPager, pgno, aD
7970: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
7980: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7990: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
79a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
79b0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
79c0: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
79d0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
79e0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
79f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
7a00: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
7a10: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
7a20: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
7a30: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
7a40: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
7a50: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
7a60: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
7a70: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
7a80: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
7a90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
7aa0: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
7ab0: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
7ac0: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
7ad0: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
7ae0: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
7af0: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
7b00: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
7b10: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
7b20: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
7b30: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
7b40: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
7b50: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ty..  */.  pPg =
7b60: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
7b70: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
7b80: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
7b90: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
7ba0: 55 53 49 56 45 20 7c 7c 20 70 50 67 20 29 3b 0a  USIVE || pPg );.
7bb0: 20 20 54 52 41 43 45 33 28 22 50 4c 41 59 42 41    TRACE3("PLAYBA
7bc0: 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CK %d page %d\n"
7bd0: 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20  , pPager->fd.h, 
7be0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
7bf0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
7c00: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
7c10: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
7c20: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
7c30: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
7c40: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
7c50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7c60: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
7c70: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
7c80: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
7c90: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
7ca0: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
7cb0: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 72 6f 6c  ould ever be rol
7cc0: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
7cd0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 20   in use, except 
7ce0: 66 6f 72 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  for page.    ** 
7cf0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
7d00: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
7d10: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
7d20: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
7d30: 0a 20 20 20 20 2a 2a 20 61 63 74 69 76 65 2e 0a  .    ** active..
7d40: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
7d50: 2a 70 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  *pData;.    asse
7d60: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
7d70: 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31   || pPg->pgno==1
7d80: 20 29 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20   );.    pData = 
7d90: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
7da0: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
7db0: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
7dc0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
7dd0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7de0: 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20  xDestructor ){  
7df0: 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68  /*** FIX ME:  Sh
7e00: 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65  ould this be xRe
7e10: 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20  init? ***/.     
7e20: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
7e30: 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
7e40: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
7e50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
7e60: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
7e70: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
7e80: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
7e90: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7ea0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
7eb0: 20 20 7d 0a 20 20 20 20 43 4f 44 45 43 28 70 50    }.    CODEC(pP
7ec0: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
7ed0: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a  ->pgno, 3);.  }.
7ee0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7ef0: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
7f00: 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
7f10: 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
7f20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
7f30: 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
7f40: 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
7f50: 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
7f60: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
7f70: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
7f80: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
7f90: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
7fa0: 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
7fb0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
7fc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7fd0: 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
7fe0: 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
7ff0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
8000: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
8010: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
8020: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
8030: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
8040: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
8050: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
8060: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
8070: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
8080: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
8090: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
80a0: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
80b0: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
80c0: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
80d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
80e0: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
80f0: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
8100: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
8110: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
8120: 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  aster(const char
8130: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
8140: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
8150: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f  er_open = 0;.  O
8160: 73 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20  sFile master;.  
8170: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
8180: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
8190: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
81a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
81b0: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
81c0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
81d0: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
81e0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
81f0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
8200: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8210: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
8220: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
8230: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
8240: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
8250: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
8260: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
8270: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
8280: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
8290: 26 6d 61 73 74 65 72 2c 20 30 2c 20 73 69 7a 65  &master, 0, size
82a0: 6f 66 28 6d 61 73 74 65 72 29 29 3b 0a 20 20 72  of(master));.  r
82b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
82c0: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
82d0: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69  r, &master);.  i
82e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
82f0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
8300: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
8310: 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d  open = 1;.  rc =
8320: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
8330: 7a 65 28 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(&master, &nMa
8340: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
8350: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8360: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
8370: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
8380: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
8390: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
83a0: 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
83b0: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
83c0: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
83d0: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
83e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
83f0: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
8400: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
8410: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
8420: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
8430: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20  asterJournal. . 
8440: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
8450: 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72  rJournal = (char
8460: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
8470: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
8480: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
8490: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
84a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
84b0: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
84c0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
84d0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
84e0: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6d 61 73  lite3OsRead(&mas
84f0: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
8500: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
8510: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
8520: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
8530: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
8540: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
8550: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
8560: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
8570: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
8580: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
8590: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
85a0: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
85b0: 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29  Exists(zJournal)
85c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
85d0: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
85e0: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
85f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8600: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
8610: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
8620: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
8630: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
8640: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
8650: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
8660: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
8670: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
8680: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
8690: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
86a0: 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75 72 6e 61     OsFile journa
86b0: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  l;..        mems
86c0: 65 74 28 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20  et(&journal, 0, 
86d0: 73 69 7a 65 6f 66 28 6a 6f 75 72 6e 61 6c 29 29  sizeof(journal))
86e0: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
86f0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
8700: 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26  Only(zJournal, &
8710: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
8720: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8730: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
8740: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
8750: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
8760: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
8770: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26  dMasterJournal(&
8780: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
8790: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
87a0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
87b0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
87c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
87d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
87e0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
87f0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
8800: 20 20 20 20 20 20 20 69 66 28 20 7a 4d 61 73 74         if( zMast
8810: 65 72 50 74 72 20 26 26 20 21 73 74 72 63 6d 70  erPtr && !strcmp
8820: 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
8830: 73 74 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ster) ){.       
8840: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
8850: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
8860: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
8870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
8880: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
8890: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
88a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
88b0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
88c0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
88d0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
88e0: 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f   }.  .  sqlite3O
88f0: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
8900: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
8910: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
8920: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
8930: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
8940: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
8950: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
8960: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
8970: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
8980: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8990: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
89a0: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
89b0: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
89c0: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
89d0: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
89e0: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
89f0: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
8a00: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
8a10: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
8a20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8a30: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
8a40: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
8a50: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
8a60: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
8a70: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
8a80: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
8a90: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
8aa0: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
8ab0: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
8ac0: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
8ad0: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
8ae0: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
8af0: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
8b00: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
8b10: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
8b20: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
8b30: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
8b40: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
8b50: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
8b60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
8b70: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
8b80: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
8b90: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
8ba0: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d  ar zBuf[SQLITE_M
8bb0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20  AX_PAGE_SIZE];. 
8bc0: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
8bd0: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
8be0: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
8bf0: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
8c00: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
8c10: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
8c20: 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
8c30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8c40: 2a 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f  *(i64)(pPg->pgno
8c50: 2d 31 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  -1));.      rc =
8c60: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
8c70: 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
8c80: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8c90: 7a 65 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ze);.      TRACE
8ca0: 33 28 22 52 45 46 45 54 43 48 20 25 64 20 70 61  3("REFETCH %d pa
8cb0: 67 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ge %d\n", pPager
8cc0: 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e  ->fd.h, pPg->pgn
8cd0: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
8ce0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8cf0: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42  CODEC(pPager, zB
8d00: 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32  uf, pPg->pgno, 2
8d10: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8d20: 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
8d30: 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
8d40: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
8d50: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
8d60: 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66  0 || memcmp(zBuf
8d70: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
8d80: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
8d90: 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20  geSize) ){.     
8da0: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
8db0: 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66  _DATA(pPg), zBuf
8dc0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8dd0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ze);.      if( p
8de0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
8df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
8e00: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
8e10: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
8e20: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8e30: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
8e40: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
8e50: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
8e60: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
8e70: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
8e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8e90: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
8ea0: 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  c = 0;.    pPg->
8eb0: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
8ec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8ed0: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
8ee0: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
8ef0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
8f00: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
8f10: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
8f20: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8f30: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
8f40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8f50: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 72 65  int nPage){.  re
8f60: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72  turn sqlite3OsTr
8f70: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
8f80: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
8f90: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29  Size*(i64)nPage)
8fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
8fb0: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
8fc0: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
8fd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8fe0: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
8ff0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
9000: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
9010: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
9020: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
9030: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
9040: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
9050: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
9060: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
9070: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
9080: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
9090: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
90a0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
90b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
90c0: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
90d0: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
90e0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
90f0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
9100: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
9110: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
9120: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
9130: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
9140: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
9150: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
9160: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
9170: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
9180: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
9190: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
91a0: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
91b0: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
91c0: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
91d0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
91e0: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
91f0: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
9200: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
9210: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
9220: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
9230: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
9240: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9250: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
9260: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
9270: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
9280: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
9290: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
92a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
92b0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
92c0: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e  nal.).**  (6)  N
92d0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
92e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
92f0: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
9300: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
9310: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
9320: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
9330: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
9340: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
9350: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
9360: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
9370: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
9380: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
9390: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
93a0: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
93b0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
93c0: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
93d0: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20  UTF-8..**  (7)  
93e0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
93f0: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
9400: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
9410: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
9420: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
9430: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
9440: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
9450: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
9460: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
9470: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
9480: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
9490: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
94a0: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
94b0: 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61   first 6 items a
94c0: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
94d0: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
94e0: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
94f0: 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65  e of the 7th ite
9500: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
9510: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
9520: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
9530: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
9540: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
9550: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
9560: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
9570: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
9580: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
9590: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
95a0: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
95b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
95c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
95d0: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
95e0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
95f0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9600: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
9610: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
9620: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
9630: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
9640: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
9650: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
9660: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
9670: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
9680: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
9690: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
96a0: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
96b0: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
96c0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
96d0: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
96e0: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
96f0: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
9700: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
9710: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
9720: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
9730: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
9740: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
9750: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
9760: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
9770: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
9780: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
9790: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
97a0: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
97b0: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
97c0: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
97d0: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
97e0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
97f0: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
9800: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
9810: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
9820: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
9830: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
9840: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
9850: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
9860: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
9870: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
9880: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
9890: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
98a0: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
98b0: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
98c0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
98d0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
98e0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
98f0: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
9900: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
9910: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
9920: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
9930: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
9940: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
9950: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
9960: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
9970: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
9980: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
9990: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
99a0: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
99b0: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
99c0: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
99d0: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
99e0: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
99f0: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
9a00: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
9a10: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
9a20: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
9a30: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
9a40: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
9a50: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
9a60: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
9a90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
9aa0: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
9ab0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
9ac0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9ad0: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
9ae0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
9af0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9b00: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9b10: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
9b20: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
9b30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9b40: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
9b50: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
9b60: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
9b70: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
9b80: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
9b90: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
9ba0: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
9bb0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
9bc0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9bd0: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
9be0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
9bf0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
9c00: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
9c10: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
9c20: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
9c30: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
9c40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
9c50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
9c60: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
9c70: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
9c80: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
9c90: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9ca0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
9cb0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
9cc0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
9cd0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9ce0: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
9cf0: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
9d00: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
9d10: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
9d20: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
9d30: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
9d40: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
9d50: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
9d60: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
9d70: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
9d80: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
9d90: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
9da0: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
9db0: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
9dc0: 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67 65  erJournal(&pPage
9dd0: 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72  r->jfd, &zMaster
9de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
9df0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
9e00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9e10: 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20  _OK || (zMaster 
9e20: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  && !sqlite3OsFil
9e30: 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29  eExists(zMaster)
9e40: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
9e50: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
9e60: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
9e70: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9e80: 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
9e90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
9ea0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
9eb0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
9ec0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
9ed0: 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  , 0);.  pPager->
9ee0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
9ef0: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
9f00: 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
9f10: 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a  r when the readJ
9f20: 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c  ournalHdr() call
9f30: 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51   returns.  ** SQ
9f40: 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
9f50: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
9f60: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
9f70: 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  {..    /* Read t
9f80: 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
9f90: 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
9fa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
9fb0: 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
9fc0: 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
9fd0: 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
9fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
9ff0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
a000: 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
a010: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
a020: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
a030: 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69  st of failed whi
a040: 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
a050: 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
a060: 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
a070: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
a080: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
a090: 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
a0a0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
a0b0: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
a0c0: 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
a0d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
a0e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
a0f0: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
a100: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a110: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
a120: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
a130: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
a140: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
a150: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
a160: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
a170: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
a180: 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
a190: 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
a1a0: 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
a1b0: 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
a1c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
a1d0: 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
a1e0: 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
a1f0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
a200: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
a210: 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
a220: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
a230: 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
a240: 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
a250: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
a260: 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
a270: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a280: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
a290: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
a2a0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a2b0: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f  nRec = (szJ - JO
a2c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
a2d0: 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
a2e0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
a2f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
a300: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
a310: 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
a320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
a330: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
a340: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
a350: 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69  back to it's ori
a360: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
a370: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
a380: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
a390: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
a3a0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
a3b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
a3c0: 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20  rigDbSize==0 || 
a3d0: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
a3e0: 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20  ze==mxPg );.    
a3f0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
a400: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
a410: 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
a420: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a430: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
a440: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
a450: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
a460: 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
a470: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63      }..    /* rc
a480: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
a490: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a  (&pPager->jfd, J
a4a0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
a4b0: 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69  ager)); */.    i
a4c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a4d0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
a4e0: 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  back;.  .    /* 
a4f0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
a500: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
a510: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
a520: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
a530: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
a540: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
a550: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
a560: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
a570: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
a580: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ger, &pPager->jf
a590: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
a5a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
a5b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
a5c0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
a5e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
a5f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
a600: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
a610: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a620: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a630: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
a640: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
a650: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a660: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61    }.  }..  /* Pa
a670: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ges that have be
a680: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
a690: 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65  e journal but ne
a6a0: 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  ver synced.  ** 
a6b0: 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72  where not restor
a6c0: 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61  ed by the loop a
a6d0: 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74  bove.  We have t
a6e0: 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a  o restore those.
a6f0: 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65    ** pages by re
a700: 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20  ading them back 
a710: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
a720: 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  l database..  */
a730: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
a740: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61  QLITE_OK );.  pa
a750: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
a760: 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70  (pPager);..end_p
a770: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
a780: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a790: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
a7a0: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
a7b0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
a7c0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
a7d0: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
a7e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
a7f0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
a800: 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c  ill return true,
a810: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
a820: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
a830: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
a840: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65  er journal. If e
a850: 72 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63  rrors .    ** oc
a860: 63 75 72 20 64 75 72 69 6e 67 20 74 68 69 73 20  cur during this 
a870: 70 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20  process, ignore 
a880: 74 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  them..    */.   
a890: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a8a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
a8b0: 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73  r_delmaster(zMas
a8c0: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
a8d0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
a8e0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
a8f0: 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
a900: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
a910: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
a920: 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
a930: 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
a940: 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
a950: 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
a960: 20 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52   different PAGER
a970: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a  _SECTOR_SIZE.  *
a980: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
a990: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
a9a0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
a9b0: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
a9c0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a9d0: 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f  ze = PAGER_SECTO
a9e0: 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  R_SIZE;.  return
a9f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
aa00: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
aa10: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
aa20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
aa30: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
aa40: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
aa50: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
aa60: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
aa70: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
aa80: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
aa90: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
aaa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
aab0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
aac0: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
aad0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
aae0: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
aaf0: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
ab00: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
ab10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
ab20: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
ab30: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
ab40: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
ab50: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
ab60: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
ab70: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
ab80: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
ab90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
aba0: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
abb0: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
abc0: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
abd0: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
abe0: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
abf0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
ac00: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
ac10: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
ac20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ac30: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
ac40: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
ac50: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac70: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
ac80: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aca0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
acb0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
acc0: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
acd0: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
ace0: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
acf0: 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
ad00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
ad10: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
ad20: 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
ad30: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ad40: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
ad50: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
ad60: 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
ad70: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
ad80: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
ad90: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
ada0: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
adb0: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20  header written. 
adc0: 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65   ** this stateme
add0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
ade0: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
adf0: 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75  e file if no jou
ae00: 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72  rnal.  ** header
ae10: 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20   was written..  
ae20: 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50  */.  hdrOff = pP
ae30: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
ae40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ae50: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20  er->fullSync || 
ae60: 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28  !hdrOff );.  if(
ae70: 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20   !hdrOff ){.    
ae80: 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  hdrOff = szJ;.  
ae90: 7d 0a 20 20 0a 0a 20 20 2f 2a 20 54 72 75 6e 63  }.  ..  /* Trunc
aea0: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
aeb0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
aec0: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
aed0: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
aee0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
aef0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
af00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
af10: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
af20: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
af30: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
af40: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
af50: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
af60: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
af70: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
af80: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
af90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
afa0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
afb0: 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  k(&pPager->stfd,
afc0: 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50   0);.  nRec = pP
afd0: 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a  ager->stmtNRec;.
afe0: 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69    .  /* Copy ori
aff0: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
b000: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
b010: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
b020: 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  k into the.  ** 
b030: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
b040: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74  Note that the st
b050: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
b060: 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20  omits checksums 
b070: 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72  from.  ** each r
b080: 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65  ecord since powe
b090: 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65  r-failure recove
b0a0: 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74  ry is not import
b0b0: 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74  ant to statement
b0c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a  .  ** journals..
b0d0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65    */.  for(i=nRe
b0e0: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
b0f0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b100: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
b110: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
b120: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
b130: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
b140: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
b150: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b160: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
b170: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
b180: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
b190: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
b1a0: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
b1b0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
b1c0: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
b1d0: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
b1e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b1f0: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
b200: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
b210: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
b220: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
b230: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
b240: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
b250: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
b260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
b270: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
b280: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
b290: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
b2a0: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
b2b0: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
b2c0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
b2d0: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
b2e0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
b2f0: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
b300: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
b310: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
b320: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
b330: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
b340: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
b350: 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
b360: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b370: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  {.    goto end_s
b380: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
b390: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
b3a0: 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
b3b0: 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
b3c0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
b3d0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
b3e0: 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a  sum;.  assert( J
b3f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
b400: 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70  ager)<(pPager->p
b410: 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20  ageSize+8) );.  
b420: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
b430: 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64  ournalOff <= (hd
b440: 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61  rOff-(pPager->pa
b450: 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20  geSize+8)) ){.  
b460: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
b470: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
b480: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
b490: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  jfd, 1);.    ass
b4a0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
b4b0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
b4c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b4d0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
b4e0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
b4f0: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
b500: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
b510: 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b 0a  {.    u32 nRec;.
b520: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
b530: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
b540: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
b550: 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d  zJ, &nRec, &dumm
b560: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
b570: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b580: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
b590: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
b5a0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
b5b0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
b5c0: 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  }.    if( nRec==
b5d0: 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  0 ){.      nRec 
b5e0: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
b5f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
b600: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b610: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
b620: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
b630: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
b640: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
b650: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
b660: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
b670: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
b680: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  &pPager->jfd, 1)
b690: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b6a0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
b6b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
b6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b6d0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
b6e0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
b6f0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
b700: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
b710: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
b720: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
b730: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
b740: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
b750: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
b760: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
b770: 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20  TE_CORRUPT;  /* 
b780: 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a  bkpt-CORRUPT */.
b790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
b7a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b7b0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
b7c0: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
b7d0: 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
b7e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b7f0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b800: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
b810: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
b820: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
b830: 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  owed..**.** The 
b840: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69  maximum number i
b850: 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  s the absolute v
b860: 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61  alue of the mxPa
b870: 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  ge parameter..**
b880: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
b890: 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79  gative, the noSy
b8a0: 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20  nc flag is also 
b8b0: 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70  set.  noSync byp
b8c0: 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74  asses.** calls t
b8d0: 6f 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  o sqlite3OsSync(
b8e0: 29 2e 20 20 54 68 65 20 70 61 67 65 72 20 72 75  ).  The pager ru
b8f0: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 77  ns much faster w
b900: 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a  ith noSync on,.*
b910: 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f 70 65  * but if the ope
b920: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
b930: 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
b940: 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  s an abrupt powe
b950: 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74  r .** failure, t
b960: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b970: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
b980: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
b990: 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69  t and.** unrepai
b9a0: 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a  rable state.  .*
b9b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
b9c0: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
b9d0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
b9e0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
b9f0: 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b  if( mxPage>=0 ){
ba00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
ba10: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
ba20: 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20  mpFile;.    if( 
ba30: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
ba40: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
ba50: 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c 73 65 7b  c = 0; .  }else{
ba60: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
ba70: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50  ync = 1;.    mxP
ba80: 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20  age = -mxPage;. 
ba90: 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e   }.  if( mxPage>
baa0: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
bab0: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
bac0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
bad0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
bae0: 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
baf0: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
bb00: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
bb10: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
bb20: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
bb30: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
bb40: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
bb50: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
bb60: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
bb70: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
bb80: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
bb90: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
bba0: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
bbb0: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
bbc0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
bbd0: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
bbe0: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
bbf0: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
bc00: 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
bc10: 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
bc20: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
bc30: 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
bc40: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
bc50: 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
bc60: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
bc70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bc80: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
bc90: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
bca0: 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
bcb0: 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
bcc0: 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
bcd0: 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
bce0: 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
bcf0: 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
bd00: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
bd10: 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
bd20: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
bd30: 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
bd40: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
bd50: 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
bd60: 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
bd70: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
bd80: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
bd90: 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
bda0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
bdb0: 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
bdc0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
bdd0: 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
bde0: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
bdf0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
be00: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
be10: 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
be20: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
be30: 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
be40: 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
be50: 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
be60: 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
be70: 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
be80: 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
bea0: 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
beb0: 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
bec0: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
bed0: 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
bee0: 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
bef0: 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
bf00: 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
bf10: 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
bf20: 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
bf30: 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
bf40: 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
bf50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
bf60: 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
bf70: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
bf80: 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
bf90: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
bfa0: 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
bfb0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
bfc0: 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
bfd0: 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
bfe0: 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
bff0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
c000: 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f  ager_set_safety_
c010: 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  level(Pager *pPa
c020: 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b  ger, int level){
c030: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
c040: 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c  c =  level==1 ||
c050: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
c060: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
c070: 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33  lSync = level==3
c080: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
c090: 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
c0a0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
c0b0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
c0c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65   0;.}../*.** Ope
c0d0: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
c0e0: 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  le.  Write the n
c0f0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
c100: 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a  into zName.** (z
c110: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20  Name must be at 
c120: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
c130: 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73  PNAME_SIZE bytes
c140: 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a   long.)  Write.*
c150: 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
c160: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
c170: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c180: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
c190: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
c1a0: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
c1b0: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ail..**.** The O
c1c0: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
c1d0: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
c1e0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
c1f0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f  hen it is.** clo
c200: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
c210: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
c220: 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a  opentemp(char *z
c230: 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64  File, OsFile *fd
c240: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38  ){.  int cnt = 8
c250: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  ;.  int rc;.  do
c260: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
c270: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
c280: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
c290: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c2a0: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
c2b0: 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20  File, fd, 1);.  
c2c0: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
c2d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
c2e0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
c2f0: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
c300: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
c310: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
c320: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
c330: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
c340: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
c350: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
c360: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
c370: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
c380: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
c390: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
c3a0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
c3b0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
c3c0: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
c3d0: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
c3e0: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
c3f0: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
c400: 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ng sqlite3pager_
c410: 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  unref()..**.** I
c420: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
c430: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
c440: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
c450: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
c460: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
c470: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
c480: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
c490: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
c4a0: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
c4b0: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
c4c0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
c4d0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
c4e0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
c4f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
c500: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
c510: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
c520: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
c530: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
c540: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
c550: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
c560: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
c570: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
c580: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
c590: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
c5a0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
c5b0: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
c5c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
c5d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
c5e0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
c5f0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
c600: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
c610: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
c620: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
c630: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
c640: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
c650: 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
c660: 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
c670: 54 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f  TRUE to use a ro
c680: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
c690: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  n this file */.)
c6a0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
c6b0: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  r;.  char *zFull
c6c0: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
c6d0: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f  int nameLen;.  O
c6e0: 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20  sFile fd;.  int 
c6f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c700: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
c710: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
c720: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
c730: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
c740: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
c750: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
c760: 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65  IZE];..  *ppPage
c770: 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 0;.  memset(
c780: 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  &fd, 0, sizeof(f
c790: 64 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  d));.  if( sqlit
c7a0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
c7b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c7c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
c7d0: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
c7e0: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
c7f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
c800: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
c810: 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
c820: 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
c830: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
c840: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
c850: 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63  up("");.      rc
c860: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c870: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
c880: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
c890: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
c8a0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
c8b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
c8c0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
c8d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c8e0: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
c8f0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
c900: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
c910: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c920: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
c930: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
c940: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64  ntemp(zTemp, &fd
c950: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
c960: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
c970: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
c980: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
c990: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
c9a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c9b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74  TE_OK ){.      t
c9c0: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
c9d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46   }.  }.  if( !zF
c9e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
c9f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
ca00: 65 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74 75  e(&fd);.    retu
ca10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ca20: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
ca30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ca40: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
ca50: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
ca60: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
ca70: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
ca80: 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e  c;.  }.  nameLen
ca90: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
caa0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
cab0: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
cac0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
cad0: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b  r) + nameLen*3 +
cae0: 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61   30 );.  if( pPa
caf0: 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ger==0 ){.    sq
cb00: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
cb10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
cb20: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
cb30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
cb40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
cb50: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64   TRACE3("OPEN %d
cb60: 20 25 73 5c 6e 22 2c 20 66 64 2e 68 2c 20 7a 46   %s\n", fd.h, zF
cb70: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
cb80: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
cb90: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67  e = (char*)&pPag
cba0: 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  er[1];.  pPager-
cbb0: 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
cbc0: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
cbd0: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70  [nameLen+1];.  p
cbe0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
cbf0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  = &pPager->zDire
cc00: 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ctory[nameLen+1]
cc10: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
cc20: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46  r->zFilename, zF
cc30: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
cc40: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
cc50: 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c  Directory, zFull
cc60: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Pathname);.  for
cc70: 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20  (i=nameLen; i>0 
cc80: 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
cc90: 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
cca0: 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
ccb0: 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
ccc0: 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
ccd0: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
cce0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c  ->zJournal, zFul
ccf0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71  lPathname);.  sq
cd00: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
cd10: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
cd20: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
cd30: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
cd40: 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61  journal");.  pPa
cd50: 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 23 69  ger->fd = fd;.#i
cd60: 66 20 4f 53 5f 55 4e 49 58 0a 20 20 70 50 61 67  f OS_UNIX.  pPag
cd70: 65 72 2d 3e 66 64 2e 70 50 61 67 65 72 20 3d 20  er->fd.pPager = 
cd80: 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20  pPager;.#endif. 
cd90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cda0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
cdb0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
cdc0: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
cdd0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
cde0: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
cdf0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
ce00: 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  se = 0;.  pPager
ce10: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 50  ->nRef = 0;.  pP
ce20: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
ce30: 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
ce40: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
ce50: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
ce60: 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d  _SIZE;.  pPager-
ce70: 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20  >stmtSize = 0;. 
ce80: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
ce90: 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ze = 0;.  pPager
cea0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
ceb0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
cec0: 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  100;.  pPager->s
ced0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
cee0: 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  OCK;.  pPager->e
cef0: 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50  rrMask = 0;.  pP
cf00: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
cf10: 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61   tempFile;.  pPa
cf20: 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d  ger->memDb = mem
cf30: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
cf40: 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c  adOnly = readOnl
cf50: 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  y;.  pPager->nee
cf60: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
cf70: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
cf80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
cf90: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
cfa0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
cfb0: 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
cfc0: 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67  ync?0:1);.  pPag
cfd0: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
cfe0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
cff0: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
d000: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
d010: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
d020: 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50  a = nExtra;.  pP
d030: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d040: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
d050: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
d060: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
d070: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
d080: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
d090: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
d0a0: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
d0b0: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
d0c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d0d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
d0e0: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
d0f0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
d100: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
d110: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
d120: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
d130: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
d140: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
d150: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
d160: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
d170: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
d180: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
d190: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
d1a0: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
d1b0: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
d1c0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
d1d0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
d1e0: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
d1f0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
d200: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
d210: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
d220: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
d230: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
d240: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
d250: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
d260: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
d270: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
d280: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
d290: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
d2a0: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
d2b0: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
d2c0: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
d2d0: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
d2e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
d2f0: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
d300: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
d310: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
d320: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
d330: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
d340: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
d350: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
d360: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
d370: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
d380: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
d390: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
d3a0: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
d3b0: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
d3c0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
d3d0: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
d3e0: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
d3f0: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
d400: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
d410: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
d420: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
d430: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
d440: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
d450: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
d460: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
d470: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
d480: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
d490: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
d4a0: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
d4b0: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
d4c0: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
d4d0: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
d4e0: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
d4f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
d500: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
d510: 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
d520: 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68   must only be ch
d530: 61 6e 67 65 64 20 77 68 65 6e 20 74 68 65 20 63  anged when the c
d540: 61 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  ache is empty..*
d550: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
d560: 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65  ger_set_pagesize
d570: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d580: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
d590: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
d5a0: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
d5b0: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
d5c0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50  AGE_SIZE );.  pP
d5d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
d5e0: 20 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a   pageSize;.}../*
d5f0: 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
d600: 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
d610: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
d620: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
d630: 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
d640: 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  est points to.  
d650: 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
d660: 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f  g is done..*/.vo
d670: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
d680: 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28  read_fileheader(
d690: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d6a0: 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
d6b0: 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d  har *pDest){.  m
d6c0: 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
d6d0: 4e 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  N);.  if( pPager
d6e0: 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 7b 0a 20 20  ->memDb==0 ){.  
d6f0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
d700: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  &pPager->fd, 0);
d710: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65  .    sqlite3OsRe
d720: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
d730: 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d  pDest, N);.  }.}
d740: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d750: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
d760: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
d770: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
d780: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
d790: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
d7a0: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
d7b0: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
d7c0: 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73  ){.  i64 n;.  as
d7d0: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
d7e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
d7f0: 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
d800: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
d810: 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  >dbSize;.  }.  i
d820: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
d830: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
d840: 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , &n)!=SQLITE_OK
d850: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
d860: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
d870: 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72  _ERR_DISK;.    r
d880: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d890: 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
d8a0: 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 70 50 61  Size;.  if( !pPa
d8b0: 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 6e 3d  ger->memDb && n=
d8c0: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
d8d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
d8e0: 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
d8f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
d900: 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
d910: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
d920: 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a  dbSize = n;.  }.
d930: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
d940: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
d950: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
d960: 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
d970: 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a  al(Pager*);.../*
d980: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
d990: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
d9a0: 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
d9b0: 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
d9c0: 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
d9d0: 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
d9e0: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
d9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
da00: 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
da10: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
da20: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
da30: 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
da40: 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
da50: 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
da60: 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
da70: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
da80: 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
da90: 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
daa0: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
dab0: 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
dac0: 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
dad0: 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
dae0: 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
daf0: 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
db00: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
db10: 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
db20: 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
db30: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
db40: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
db50: 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
db60: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
db70: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
db80: 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
db90: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
dba0: 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
dbb0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
dbc0: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
dbd0: 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
dbe0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
dbf0: 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
dc00: 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
dc10: 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
dc20: 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
dc30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
dc40: 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
dc50: 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
dc60: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
dc70: 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
dc80: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
dc90: 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
dca0: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
dcb0: 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
dcc0: 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ble */.  if( pPg
dcd0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
dce0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
dcf0: 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
dd00: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20  Pg->pPrevHash;. 
dd10: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50   }.  if( pPg->pP
dd20: 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 70  revHash ){.    p
dd30: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
dd40: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
dd50: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
dd60: 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
dd70: 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e  pager_hash(pPg->
dd80: 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
dd90: 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
dda0: 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  [h]==pPg );.    
ddb0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
ddc0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
ddd0: 68 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  h;.  }.  pPg->pN
dde0: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
ddf0: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
de00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
de10: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
de20: 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65  runcate an in-me
de30: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
de40: 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61  Delete.** all pa
de50: 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
de60: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
de70: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64  ager->dbSize and
de80: 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64   is unreferenced
de90: 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  ..** Referenced 
dea0: 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
deb0: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
dec0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a   are zeroed..*/.
ded0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f  static void memo
dee0: 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  ryTruncate(Pager
def0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
df00: 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72  dr *pPg;.  PgHdr
df10: 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64   **ppPg;.  int d
df20: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
df30: 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20  dbSize;..  ppPg 
df40: 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  = &pPager->pAll;
df50: 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d  .  while( (pPg =
df60: 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20   *ppPg)!=0 ){.  
df70: 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
df80: 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  =dbSize ){.     
df90: 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
dfa0: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
dfb0: 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e  e if( pPg->nRef>
dfc0: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
dfd0: 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
dfe0: 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
dff0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
e000: 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
e010: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
e020: 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20  se{.      *ppPg 
e030: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
e040: 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67  .      unlinkPag
e050: 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  e(pPg);.      sq
e060: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
e070: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
e080: 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
e090: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
e0a0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
e0b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
e0c0: 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
e0d0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
e0e0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
e0f0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
e100: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
e110: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70    sqlite3pager_p
e120: 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
e130: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e140: 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
e150: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
e160: 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
e170: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e180: 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
e190: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
e1a0: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
e1b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e1c0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
e1d0: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ->memDb ){.    p
e1e0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
e1f0: 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
e200: 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
e210: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e220: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
e230: 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
e240: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
e250: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e260: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e270: 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f   }.  rc = pager_
e280: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
e290: 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   nPage);.  if( r
e2a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e2b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
e2c0: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ze = nPage;.  }.
e2d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e2e0: 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
e2f0: 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
e300: 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
e310: 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
e320: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
e330: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
e340: 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
e350: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e360: 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
e370: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
e380: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
e390: 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
e3a0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
e3b0: 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
e3c0: 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
e3d0: 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
e3e0: 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
e3f0: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
e400: 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
e410: 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
e420: 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
e430: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
e440: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
e450: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
e460: 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72  ager_close(Pager
e470: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
e480: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
e490: 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65  .  switch( pPage
e4a0: 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20  r->state ){.    
e4b0: 63 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52  case PAGER_RESER
e4c0: 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41  VED:.    case PA
e4d0: 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20  GER_SYNCED: .   
e4e0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c   case PAGER_EXCL
e4f0: 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  USIVE: {.      s
e500: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
e510: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
e520: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
e530: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
e540: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
e550: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
e560: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
e570: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
e580: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
e590: 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  en==0 );.      b
e5a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e5b0: 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45  case PAGER_SHARE
e5c0: 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  D: {.      if( !
e5d0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
e5e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e5f0: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
e600: 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
e610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
e620: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
e630: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
e640: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
e650: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e660: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50    }.  }.  for(pP
e670: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
e680: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
e690: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
e6a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e6b0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50  memDb ){.      P
e6c0: 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
e6d0: 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
e6e0: 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
e6f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
e700: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
e710: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
e720: 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
e730: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e740: 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
e750: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
e760: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
e770: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
e780: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
e790: 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f   }.  TRACE2("CLO
e7a0: 53 45 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  SE %d\n", pPager
e7b0: 2d 3e 66 64 2e 68 29 3b 0a 20 20 73 71 6c 69 74  ->fd.h);.  sqlit
e7c0: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
e7d0: 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74  r->fd);.  assert
e7e0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
e7f0: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a  lOpen==0 );.  /*
e800: 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
e810: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
e820: 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
e830: 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
e840: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
e850: 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
e860: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
e870: 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
e880: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
e890: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68  ->zFilename!=(ch
e8a0: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 20 29  ar*)&pPager[1] )
e8b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 20  {.    assert( 0 
e8c0: 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
e8d0: 70 70 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ppen */.    sqli
e8e0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
e8f0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Filename);.    s
e900: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
e910: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
e920: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
e930: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
e940: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
e950: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
e960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e970: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e980: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
e990: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
e9a0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
e9b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
e9c0: 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
e9d0: 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
e9e0: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
e9f0: 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
ea00: 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
ea10: 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
ea20: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
ea30: 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
ea40: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
ea50: 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
ea60: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
ea70: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
ea80: 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
ea90: 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
eaa0: 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
eab0: 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
eac0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
ead0: 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
eae0: 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
eaf0: 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
eb00: 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
eb10: 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
eb20: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
eb30: 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
eb40: 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
eb50: 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
eb60: 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
eb70: 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
eb80: 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
eb90: 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
eba0: 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
ebb0: 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
ebc0: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
ebd0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
ebe0: 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
ebf0: 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
ec00: 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
ec10: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
ec20: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
ec30: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
ec40: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
ec50: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
ec60: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
ec70: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
ec80: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
ec90: 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
eca0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
ecb0: 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
ecc0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
ecd0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
ece0: 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
ecf0: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
ed00: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
ed10: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
ed20: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
ed30: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
ed40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
ed50: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
ed60: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
ed70: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
ed80: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
ed90: 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
eda0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
edb0: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
edc0: 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
edd0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
ede0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
edf0: 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
ee00: 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
ee10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
ee20: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
ee30: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
ee40: 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
ee50: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
ee60: 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
ee70: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ee80: 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
ee90: 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
eea0: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
eeb0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
eec0: 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
eed0: 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
eee0: 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
eef0: 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
ef00: 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
ef10: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
ef20: 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
ef30: 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
ef40: 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
ef50: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
ef60: 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
ef70: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28  qlite3pager_ref(
ef80: 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
ef90: 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
efa0: 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
efb0: 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  );.  page_ref(pP
efc0: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
efd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
efe0: 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
eff0: 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
f000: 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
f010: 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
f020: 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
f030: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
f040: 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
f050: 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
f060: 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
f070: 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
f080: 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
f090: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
f0a0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
f0b0: 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
f0c0: 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
f0d0: 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
f0e0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f0f0: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
f100: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
f110: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
f120: 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
f130: 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
f140: 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
f150: 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
f160: 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
f170: 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
f180: 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
f190: 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
f1a0: 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
f1b0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
f1c0: 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
f1d0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
f1e0: 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
f1f0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
f200: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
f210: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
f220: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
f230: 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
f240: 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
f250: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
f260: 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
f270: 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
f280: 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
f290: 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
f2a0: 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
f2b0: 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
f2c0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
f2d0: 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
f2e0: 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
f2f0: 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
f300: 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
f310: 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
f320: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
f330: 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
f340: 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
f350: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
f360: 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
f370: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f380: 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
f390: 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
f3a0: 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
f3b0: 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
f3c0: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
f3d0: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
f3e0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
f3f0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
f400: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f410: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
f420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
f430: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
f440: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
f450: 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
f460: 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
f470: 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
f480: 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
f490: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
f4a0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
f4b0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
f4c0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
f4d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f4e0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
f4f0: 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
f500: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
f510: 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
f520: 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
f530: 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
f540: 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
f550: 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
f560: 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
f570: 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
f580: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
f590: 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
f5a0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
f5b0: 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
f5c0: 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
f5d0: 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
f5e0: 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
f5f0: 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
f600: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
f610: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
f620: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
f630: 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a         i64 jSz;.
f640: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f650: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
f660: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
f670: 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
f680: 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
f690: 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
f6a0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
f6b0: 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
f6c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
f6d0: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
f6e0: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
f6f0: 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
f700: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
f710: 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
f720: 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
f730: 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
f740: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
f750: 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
f760: 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
f770: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
f780: 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
f790: 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
f7a0: 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
f7b0: 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
f7c0: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
f7d0: 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
f7e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
f7f0: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
f800: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
f810: 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
f820: 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
f830: 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
f840: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
f850: 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
f860: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
f870: 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
f880: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
f8a0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
f8b0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
f8c0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
f8d0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f8e0: 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 72  gic));.        r
f8f0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
f900: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
f910: 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
f920: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
f930: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
f940: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
f950: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
f960: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f970: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f980: 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
f990: 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
f9a0: 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20  pPager->fd.h);. 
f9b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f9c0: 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  3OsSync(&pPager-
f9d0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
f9e0: 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
f9f0: 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
fa00: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
fa10: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
fa20: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
fa30: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
fa40: 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
fa50: 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
fa60: 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
fa70: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
fa80: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
fa90: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
faa0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
fab0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
fac0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
fad0: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
fae0: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  r->pFirst;.  }..
faf0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
fb00: 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
fb10: 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
fb20: 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
fb30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
fb40: 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
fb50: 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
fb60: 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
fb70: 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
fb80: 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
fb90: 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
fba0: 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
fbb0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
fbc0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
fbd0: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
fbe0: 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
fbf0: 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
fc00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
fc10: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
fc20: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
fc30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
fc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fc50: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
fc60: 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
fc70: 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
fc80: 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
fc90: 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
fca0: 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
fcb0: 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
fcc0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
fcd0: 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
fce0: 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
fcf0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
fd00: 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
fd10: 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
fd20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
fd30: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
fd40: 75 73 79 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  usy = 1;..  if( 
fd50: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
fd60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
fd70: 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
fd80: 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
fd90: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
fda0: 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
fdb0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
fdc0: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
fdd0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
fde0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
fdf0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
fe00: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
fe10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
fe20: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
fe30: 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
fe40: 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
fe50: 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
fe60: 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
fe70: 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
fe80: 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
fe90: 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
fea0: 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
feb0: 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
fec0: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
fed0: 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
fee0: 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
fef0: 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
ff00: 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
ff10: 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
ff20: 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
ff30: 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
ff40: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
ff50: 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
ff60: 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
ff70: 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
ff80: 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
ff90: 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
ffa0: 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
ffb0: 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
ffc0: 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
ffd0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
ffe0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
fff0: 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
10000 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
10010 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
10020 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10030 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
10040 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
10050 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
10060 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
10070 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
10080 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
10090 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
100a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
100b0 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
100c0 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
100d0 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
100e0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
100f0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20  back..  */.  do 
10100 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
10110 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
10120 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
10130 4c 4f 43 4b 29 3b 0a 20 20 7d 77 68 69 6c 65 28  LOCK);.  }while(
10140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
10150 20 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65   && .      pPage
10160 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
10170 26 26 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  && .      pPager
10180 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
10190 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20  xFunc && .      
101a0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
101b0 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67  dler->xFunc(pPag
101c0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
101d0 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a  ->pArg, busy++).
101e0 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53    );.  if( rc!=S
101f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10200 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10210 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
10220 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
10230 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  ;..  while( pLis
10240 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
10250 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
10260 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
10270 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
10280 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
10290 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
102a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 43 4f 44 45  eSize);.    CODE
102b0 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
102c0 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
102d0 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
102e0 0a 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f  .    TRACE3("STO
102f0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
10300 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20  , pPager->fd.h, 
10310 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
10320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10330 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66  Write(&pPager->f
10340 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
10350 28 70 4c 69 73 74 29 2c 20 70 50 61 67 65 72 2d  (pList), pPager-
10360 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
10370 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
10380 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
10390 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
103a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
103b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
103c0 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20   pList->dirty = 
103d0 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  0;.    pList = p
103e0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
103f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
10400 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10410 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
10420 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
10430 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
10440 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
10450 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
10460 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
10470 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
10480 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
10490 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
104a0 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
104b0 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
104c0 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
104d0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
104e0 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70  {.  PgHdr *p, *p
104f0 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20  List;.  pList = 
10500 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  0;.  for(p=pPage
10510 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
10520 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
10530 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a  if( p->dirty ){.
10540 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20        p->pDirty 
10550 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = pList;.      p
10560 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  List = p;.    }.
10570 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
10580 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  st;.}../*.** Acq
10590 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
105a0 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
105b0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
105c0 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
105d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
105e0 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
105f0 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
10600 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
10610 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
10620 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
10630 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f   A _get works fo
10640 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
10650 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
10660 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
10670 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
10680 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
10690 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
106a0 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
106b0 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
106c0 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
106d0 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
106e0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
106f0 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
10700 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
10710 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
10720 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
10730 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
10740 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
10750 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
10760 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
10770 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
10780 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
10790 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
107a0 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
107b0 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
107c0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
107d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
107e0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
107f0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
10800 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
10810 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
10820 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
10830 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f  routine and _loo
10840 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
10850 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
10860 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
10870 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
10880 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
10890 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
108a0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
108b0 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
108c0 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
108d0 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28  whereas _lookup(
108e0 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
108f0 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
10900 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
10910 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
10920 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
10930 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
10940 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
10950 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
10960 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
10970 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c  ary..** Since _l
10980 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
10990 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
109a0 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
109b0 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
109c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
109d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
109e0 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a  ager_get(Pager *
109f0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
10a00 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65  o, void **ppPage
10a10 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
10a20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
10a30 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
10a40 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
10a50 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
10a60 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
10a70 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
10a80 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
10a90 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
10aa0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10ab0 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
10ac0 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
10ad0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
10ae0 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
10af0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
10b00 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
10b10 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
10b20 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
10b30 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
10b40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
10b50 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
10b60 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 70  r->nRef==0 && !p
10b70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
10b80 20 20 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31      int busy = 1
10b90 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
10ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
10bb0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
10bc0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
10bd0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
10be0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20  QLITE_BUSY && . 
10bf0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
10c00 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26 20 0a  BusyHandler && .
10c10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
10c20 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
10c30 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20  unc && .        
10c40 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10c50 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50 61 67  dler->xFunc(pPag
10c60 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10c70 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a  ->pArg, busy++).
10c80 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
10c90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10ca0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10cb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
10cc0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
10cd0 5f 53 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a  _SHARED;..    /*
10ce0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
10cf0 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
10d00 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
10d10 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
10d20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
10d30 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
10d40 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
10d50 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
10d60 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
10d70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10d80 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 0a 20  useJournal && . 
10d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
10da0 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65  FileExists(pPage
10db0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26 26 0a  r->zJournal) &&.
10dc0 20 20 20 20 20 20 20 20 21 73 71 6c 69 74 65 33          !sqlite3
10dd0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
10de0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
10df0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20   .    ){.       
10e00 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  int rc;..       
10e10 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
10e20 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
10e30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
10e40 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
10e50 69 73 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70  is.       ** imp
10e60 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
10e70 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
10e80 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
10e90 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
10ea0 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
10eb0 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
10ec0 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
10ed0 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
10ee0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
10ef0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
10f00 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
10f10 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
10f20 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
10f30 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
10f40 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
10f50 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
10f60 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
10f70 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a  ng it .       **
10f80 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a   back..       **
10f90 20 0a 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61   .       ** Beca
10fa0 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
10fb0 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
10fc0 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
10fd0 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ted, the.       
10fe0 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73  ** second proces
10ff0 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68  s will get to th
11000 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
11010 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
11020 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69  .       ** obtai
11030 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55  n it's own EXCLU
11040 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
11050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
11060 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
11070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
11080 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
11090 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
110a0 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
110b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
110c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
110d0 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
110e0 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
110f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
11100 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
11110 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
11120 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11130 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
11140 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
11150 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20  XCLUSIVE;..     
11160 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
11170 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
11180 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
11190 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
111a0 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
111b0 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
111c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
111d0 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   .       **.    
111e0 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
111f0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
11200 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
11210 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
11220 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
11230 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
11240 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
11250 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
11260 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a  e holds.       *
11270 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
11280 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
11290 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
112a0 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
112b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
112c0 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
112d0 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
112e0 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  time..       */.
112f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11300 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
11310 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
11320 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
11330 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
11340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
11360 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
11370 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
11380 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
11390 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
113a0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72  LOCK;.         r
113b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
113c0 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  Y;.       }.    
113d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
113e0 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
113f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
11400 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
11410 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11420 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
11430 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
11440 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
11450 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
11460 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20  alHdr = 0;..    
11470 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
11480 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
11490 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
114a0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
114b0 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61         ** lock a
114c0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
114d0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
114e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
114f0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
11500 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
11510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  OK ){.         r
11530 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
11540 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
11550 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
11560 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
11570 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a   page in cache *
11580 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
11590 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
115a0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
115b0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
115c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
115d0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
115e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
115f0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
11600 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
11610 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
11620 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
11630 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
11640 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
11650 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a  . */.    int h;.
11660 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73      pPager->nMis
11670 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  s++;.    if( pPa
11680 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
11690 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61  r->mxPage || pPa
116a0 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c  ger->pFirst==0 |
116b0 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  | pPager->memDb 
116c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ){.      /* Crea
116d0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f  te a new page */
116e0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
116f0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
11700 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61  zeof(*pPg) + pPa
11710 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
11740 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
11750 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11770 20 20 20 20 20 20 20 20 20 20 2b 20 70 50 61 67            + pPag
11780 65 72 2d 3e 6d 65 6d 44 62 2a 73 69 7a 65 6f 66  er->memDb*sizeof
11790 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
117a0 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
117b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
117c0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
117d0 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
117e0 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
117f0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ger);.        }.
11800 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
11810 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
11820 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
11830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11840 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
11850 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
11860 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
11870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
11880 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
11890 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
118a0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
118b0 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
118c0 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
118d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
118e0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
118f0 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
11900 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
11910 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50  ->pAll;.      pP
11920 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
11930 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
11940 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nPage++;.    }el
11950 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  se{.      /* Fin
11960 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79  d a page to recy
11970 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63  cle.  Try to loc
11980 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20  ate a page that 
11990 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a  does not.      *
119a0 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
119b0 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
119c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
119d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67      */.      pPg
119e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
119f0 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20  tSynced;..      
11a00 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e  /* If we could n
11a10 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74  ot find a page t
11a20 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
11a30 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a  uire an fsync().
11a40 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
11a50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
11a60 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
11a70 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
11a80 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65  is a.      ** ve
11a90 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
11aa0 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
11ab0 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
11ac0 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
11ad0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74       ** it can't
11ae0 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20   be helped..    
11af0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
11b00 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
11b10 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
11b20 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
11b30 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
11b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
11b50 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
11b60 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11b70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11b80 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
11b90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
11ba0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
11bb0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
11bc0 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
11bd0 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61  nc mode, write a
11be0 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61   new journal hea
11bf0 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 09 20 20  der into the..  
11c00 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
11c10 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f   This is done to
11c20 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69   avoid ever modi
11c30 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a  fying a journal.
11c40 09 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61  .  ** header tha
11c50 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  t is involved in
11c60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66   the rollback of
11c70 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
11c80 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62  ..  ** already b
11c90 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
11ca0 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
11cb0 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
11cc0 69 73 0a 09 20 20 2a 2a 20 74 72 61 73 68 65 64  is..  ** trashed
11cd0 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   when the nRec f
11ce0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29  ield is updated)
11cf0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
11d00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
11d10 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
11d20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
11d30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11d40 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  > 0 );.         
11d50 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
11d60 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
11d70 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
11d80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11d90 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
11da0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
11db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
11dc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11df0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
11e00 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  irst;.      }.  
11e10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
11e20 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20  >nRef==0 );..   
11e30 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11e40 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
11e50 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
11e60 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20  is dirty..      
11e70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
11e80 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
11e90 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
11ea0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
11eb0 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72         pPg->pDir
11ec0 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ty = 0;.        
11ed0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
11ee0 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
11ef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11f00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11f10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11f20 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
11f30 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
11f40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11f50 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d  IOERR;.        }
11f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
11f70 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
11f80 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f  y==0 );..      /
11f90 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65  * If the page we
11fa0 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69   are recycling i
11fb0 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  s marked as alwa
11fc0 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  ysRollback, then
11fd0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68  .      ** set th
11fe0 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
11ff0 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
12000 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
12010 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
12020 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
12030 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
12040 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  r the rest of th
12050 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
12060 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e        ** It is n
12070 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74  ecessary to do t
12080 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20  his because the 
12090 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
120a0 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20  ysRollback.     
120b0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c   ** might be rel
120c0 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72  oaded at a later
120d0 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61   time but at tha
120e0 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74  t point we won't
120f0 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20   remember.      
12100 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d  ** that is was m
12110 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
12120 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e  back.  This mean
12130 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  s that all pages
12140 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
12150 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  e marked as alwa
12160 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ysRollback from 
12170 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20  here on out..   
12180 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
12190 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
121a0 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ack ){.        p
121b0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
121c0 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
121d0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c   }..      /* Unl
121e0 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65  ink the old page
121f0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
12200 69 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68  ist and the hash
12210 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a   table.      */.
12220 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65        unlinkPage
12230 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
12240 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20  ger->nOvfl++;.  
12250 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
12260 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
12270 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
12280 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
12290 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
122a0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
122b0 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
122c0 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
122d0 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20  rnal, pgno/8);. 
122e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
122f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
12300 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
12310 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
12320 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
12330 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
12340 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
12350 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
12360 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
12370 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
12380 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
12390 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
123a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
123b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
123c0 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
123d0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a  Pager->stmtSize.
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
123f0 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
12400 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
12410 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a  pgno&7)))!=0 ){.
12420 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
12430 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
12440 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12450 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
12460 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
12470 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
12480 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
12490 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
124a0 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
124b0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
124c0 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70  Ref++;.    h = p
124d0 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
124e0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
124f0 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
12500 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
12510 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
12520 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
12530 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
12540 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
12550 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
12560 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
12570 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
12580 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
12590 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
125a0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
125b0 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
125c0 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
125d0 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
125e0 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
125f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
12600 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
12610 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
12620 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
12630 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  Mask!=0 ){.     
12640 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
12650 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
12660 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72  A(pPg));.      r
12670 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
12680 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
12690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
126a0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
126b0 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67  ->dbSize<(int)pg
126c0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  no ){.      mems
126d0 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
126e0 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
126f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
12700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
12710 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  t rc;.      asse
12720 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
12730 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  b==0 );.      sq
12740 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
12750 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
12760 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
12770 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
12780 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
12790 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
127a0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
127b0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
127c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 52 41  Size);.      TRA
127d0 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61  CE3("FETCH %d pa
127e0 67 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ge %d\n", pPager
127f0 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e  ->fd.h, pPg->pgn
12800 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  o);.      CODEC(
12810 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
12820 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
12830 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20  >pgno, 3);.     
12840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  OK ){.        i6
12860 34 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20  4 fileSize;.    
12870 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
12880 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
12890 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29  r->fd,&fileSize)
128a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  !=SQLITE_OK.    
128b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69             || fi
128c0 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61  leSize>=pgno*pPa
128d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
128e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
128f0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
12900 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
12910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
12920 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
12930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12940 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
12950 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
12960 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
12970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
12990 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
129a0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
129b0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
129c0 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  e. */.    pPager
129d0 2d 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61  ->nHit++;.    pa
129e0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
129f0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48  .  *ppPage = PGH
12a00 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
12a10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12a20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
12a30 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
12a40 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
12a50 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
12a60 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
12a70 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
12a80 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
12a90 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
12aa0 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
12ab0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
12ac0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
12ad0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
12ae0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e  ite3pager_get().
12af0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
12b00 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
12b10 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
12b20 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
12b30 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
12b40 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
12b50 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
12b60 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
12b70 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
12b80 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
12b90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
12ba0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
12bb0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
12bc0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
12bd0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
12be0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
12bf0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ppened..*/.void 
12c00 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f  *sqlite3pager_lo
12c10 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
12c20 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
12c30 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
12c40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
12c50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12c60 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28  pgno!=0 );.  if(
12c70 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
12c80 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
12c90 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
12ca0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
12cb0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
12cc0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
12cd0 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
12ce0 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
12cf0 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
12d00 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
12d10 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
12d20 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
12d30 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
12d40 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
12d50 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
12d60 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
12d70 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
12d80 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
12d90 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
12da0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
12db0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
12dc0 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
12dd0 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
12de0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
12df0 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
12e00 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
12e10 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
12e20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
12e30 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f  PgHdr *pPg;..  /
12e40 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
12e50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12e60 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
12e70 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f  */.  pPg = DATA_
12e80 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
12e90 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
12ea0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
12eb0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
12ec0 46 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  FO(pPg);..  /* W
12ed0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
12ee0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
12ef0 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
12f00 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
12f10 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
12f20 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
12f30 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
12f40 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
12f50 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
12f60 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
12f70 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
12f80 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
12f90 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
12fa0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
12fb0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
12fc0 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
12fd0 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
12fe0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
12ff0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
13000 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
13010 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
13020 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
13030 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
13040 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
13050 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26  g->needSync==0 &
13060 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
13070 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Synced==0 ){.   
13080 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
13090 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
130a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
130b0 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
130c0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
130d0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
130e0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
130f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
13100 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
13110 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
13120 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
13130 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
13140 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
13150 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
13160 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
13170 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
13180 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
13190 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
131a0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
131b0 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & !pPager->memDb
131c0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
131d0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
131e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
131f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13200 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a  /*.** Create a j
13210 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
13220 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73  pPager.  There s
13230 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65  hould already be
13240 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f   a RESERVED.** o
13250 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
13260 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13270 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
13280 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
13290 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
132a0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
132b0 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e  rything.  Return
132c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61   an error code a
132d0 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a  nd release the.*
132e0 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  * write lock if 
132f0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
13300 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
13310 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
13320 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
13330 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
13340 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
13350 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 61 73  r->memDb );.  as
13360 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
13370 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
13380 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
13390 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
133a0 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Open==0 );.  ass
133b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
133c0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c  Journal );.  sql
133d0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
133e0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
133f0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
13400 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
13410 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
13420 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
13430 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
13440 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
13450 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
13460 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
13470 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
13480 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
13490 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
134a0 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
134b0 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
134c0 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  d,pPager->tempFi
134d0 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
134e0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
134f0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
13500 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
13510 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
13520 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
13540 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
13550 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
13560 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72  sqlite3OsOpenDir
13570 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a  ectory(pPager->z
13580 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67  Directory, &pPag
13590 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67  er->jfd);.  pPag
135a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
135b0 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
135c0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
135d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
135e0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
135f0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
13600 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
13610 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
13620 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
13630 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
13640 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
13650 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
13660 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
13670 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
13680 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
13690 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  e;..  rc = write
136a0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
136b0 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  r);..  if( pPage
136c0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
136d0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
136e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
136f0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62  ite3pager_stmt_b
13700 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
13710 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
13720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
13730 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
13740 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
13750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
13770 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
13780 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13790 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f   rc;..failed_to_
137a0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20  open_journal:.  
137b0 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
137c0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
137d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
137e0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rnal = 0;.  sqli
137f0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
13800 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
13810 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
13820 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
13830 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  K;.  return rc;.
13840 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
13850 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
13860 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
13870 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
13880 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
13890 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
138a0 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
138b0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
138c0 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73  ager_commit() is
138d0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
138e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
138f0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
13900 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
13910 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29  te3pager_close()
13920 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
13930 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
13940 5f 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  _unref() is call
13950 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
13960 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
13970 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
13980 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
13990 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
139a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
139b0 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
139c0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
139d0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
139e0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
139f0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
13a00 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
13a10 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
13a20 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
13a30 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
13a40 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
13a50 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
13a60 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
13a70 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
13a80 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
13a90 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
13aa0 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
13ab0 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
13ac0 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
13ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
13ae0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
13af0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
13b00 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
13b10 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
13b20 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
13b30 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
13b40 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
13b50 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
13b60 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
13b70 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
13b80 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
13b90 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
13ba0 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
13bb0 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
13bc0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
13bd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
13be0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
13bf0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
13c00 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
13c10 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
13c20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
13c30 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
13c40 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
13c50 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
13c60 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
13c70 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
13c80 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
13c90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13ca0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
13cb0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
13cc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
13cd0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
13ce0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
13cf0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
13d00 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
13d10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
13d20 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
13d30 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
13d40 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 70 50  emDb ){.      pP
13d50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
13d60 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
13d70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
13d80 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
13d90 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
13da0 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
13db0 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
13dc0 5f 4c 4f 43 4b 0a 20 20 20 20 20 20 69 6e 74 20  _LOCK.      int 
13dd0 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  busy = 1;.      
13de0 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20  do {.        rc 
13df0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
13e00 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  &pPager->fd, RES
13e10 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
13e20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
13e30 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 0a 20  QLITE_BUSY && . 
13e40 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
13e50 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26  >pBusyHandler &&
13e60 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67   .          pPag
13e70 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
13e80 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20  ->xFunc && .    
13e90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42        pPager->pB
13ea0 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e  usyHandler->xFun
13eb0 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  c(pPager->pBusyH
13ec0 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75  andler->pArg, bu
13ed0 73 79 2b 2b 29 0a 20 20 20 20 20 20 29 3b 0a 23  sy++).      );.#
13ee0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
13ef0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
13f00 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
13f10 56 45 44 5f 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  VED_LOCK);.#endi
13f20 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  f.      if( rc!=
13f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13f40 20 20 20 20 20 2f 2a 20 57 65 20 64 6f 20 6e 6f       /* We do no
13f50 74 20 63 61 6c 6c 20 74 68 65 20 62 75 73 79 20  t call the busy 
13f60 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 77 65 20  handler when we 
13f70 66 61 69 6c 20 74 6f 20 67 65 74 20 61 20 72 65  fail to get a re
13f80 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 20 20 20  served lock..   
13f90 20 20 20 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79       ** The only
13fa0 20 72 65 61 73 6f 6e 20 77 65 20 6d 69 67 68 74   reason we might
13fb0 20 66 61 69 6c 20 69 73 20 62 65 63 61 75 73 65   fail is because
13fc0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
13fd0 20 69 73 20 68 6f 6c 64 69 6e 67 0a 20 20 20 20   is holding.    
13fe0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 65 72      ** the reser
13ff0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 75 74 20 74  ved lock.  But t
14000 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
14010 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
14020 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
14030 72 65 6c 65 61 73 65 20 69 74 73 20 72 65 73 65  release its rese
14040 72 76 65 64 20 6c 6f 63 6b 20 75 6e 74 69 6c 20  rved lock until 
14050 74 68 69 73 20 70 72 6f 63 65 73 73 20 72 65 6c  this process rel
14060 65 61 73 65 73 20 69 74 73 20 73 68 61 72 65 64  eases its shared
14070 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
14080 2e 20 20 53 6f 20 77 65 20 6d 69 67 68 74 20 61  .  So we might a
14090 73 20 77 65 6c 6c 20 66 61 69 6c 20 69 6e 20 74  s well fail in t
140a0 68 69 73 20 70 72 6f 63 65 73 73 2c 20 6c 65 74  his process, let
140b0 20 69 74 20 72 65 6c 65 61 73 65 0a 20 20 20 20   it release.    
140c0 20 20 20 20 2a 2a 20 69 74 73 20 73 68 61 72 65      ** its share
140d0 64 20 6c 6f 63 6b 20 73 6f 20 74 68 61 74 20 74  d lock so that t
140e0 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
140f0 20 63 61 6e 20 63 6f 6d 6d 69 74 2e 0a 20 20 20   can commit..   
14100 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14110 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14120 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
14130 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
14140 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 70  ESERVED;.      p
14150 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
14160 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  e = 0;.      TRA
14170 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
14180 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
14190 66 64 2e 68 29 3b 0a 20 20 20 20 20 20 69 66 28  fd.h);.      if(
141a0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
141b0 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
141c0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
141d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
141e0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
141f0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
14200 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14210 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
14220 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
14230 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
14240 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
14250 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
14260 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
14270 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
14280 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
14290 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
142a0 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
142b0 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
142c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
142d0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
142e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
142f0 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
14300 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
14310 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
14320 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
14330 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
14340 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
14350 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
14360 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
14370 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
14380 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
14390 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
143a0 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
143b0 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
143c0 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
143d0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
143e0 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
143f0 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
14400 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
14410 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
14420 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
14430 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
14440 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
14450 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
14460 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
14470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
14480 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
14490 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
144a0 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
144b0 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
144c0 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
144d0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
144e0 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
144f0 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
14500 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61  all to sqlite3pa
14510 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20  ger_commit() or 
14520 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
14530 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
14540 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  set..*/.int sqli
14550 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 76  te3pager_write(v
14560 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
14570 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
14580 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
14590 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
145a0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
145b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
145c0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
145d0 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
145e0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
145f0 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20  >errMask ){ .   
14600 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
14610 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
14620 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
14630 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
14650 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
14660 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
14670 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20  Master );..  /* 
14680 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
14690 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
146a0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
146b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
146c0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
146d0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
146e0 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
146f0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72  .  */.  pPg->dir
14700 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ty = 1;.  if( pP
14710 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
14720 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20  (pPg->inStmt || 
14730 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
14740 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
14750 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
14760 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
14770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14780 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
14790 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
147a0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
147b0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 2a 2a  needs to be.  **
147c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
147d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
147e0 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
147f0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
14800 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  ** or both..  **
14810 0a 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63  .  ** First chec
14820 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
14830 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
14840 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
14850 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20  .  ** create it 
14860 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
14870 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
14880 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
14890 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
148a0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
148b0 72 5f 62 65 67 69 6e 28 70 44 61 74 61 29 3b 0a  r_begin(pData);.
148c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
148d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
148e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
148f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
14900 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
14910 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
14920 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
14930 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
14940 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
14950 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
14960 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
14970 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14980 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
14990 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
149a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
149b0 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
149c0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70  seJournal );.  p
149d0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
149e0 65 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  e = 1;..  /* The
149f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
14a00 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
14a10 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
14a20 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 2a  SERVED or an.  *
14a30 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
14a40 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
14a50 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
14a60 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
14a70 61 67 65 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  age to.  ** the 
14a80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
14a90 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
14aa0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
14ab0 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 2d    */.  if( !pPg-
14ac0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
14ad0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
14ae0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65 6d  l || pPager->mem
14af0 44 62 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Db) ){.    if( (
14b00 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
14b10 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
14b20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ize ){.      int
14b30 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 75 33 32   szPg;.      u32
14b40 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66   saved;.      if
14b50 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ( pPager->memDb 
14b60 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
14b70 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
14b80 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
14b90 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
14ba0 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41    TRACE3("JOURNA
14bb0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
14bc0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 2c 20 70   pPager->fd.h, p
14bd0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
14be0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
14bf0 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
14c00 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
14c10 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ig = sqliteMallo
14c20 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
14c30 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
14c40 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
14c50 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
14c60 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
14c70 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
14c80 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
14c90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
14cb0 65 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  e{.        u32 c
14cc0 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 43 4f  ksum;.        CO
14cd0 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
14ce0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
14cf0 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
14d00 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
14d10 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
14d20 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
14d30 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
14d40 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
14d50 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
14d60 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
14d70 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61  (cksum, pPg, pPa
14d80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
14d90 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
14da0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
14db0 38 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  8;.        store
14dc0 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
14dd0 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
14de0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14df0 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
14e00 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  >jfd, &((char*)p
14e10 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29  Data)[-4], szPg)
14e20 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
14e30 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
14e40 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 54 52  szPg;.        TR
14e50 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
14e60 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
14e70 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
14e80 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
14e90 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f  >fd.h, pPg->pgno
14ea0 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
14eb0 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28  ;.        CODEC(
14ec0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
14ed0 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  Pg->pgno, 0);.  
14ee0 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47 48        *(u32*)PGH
14ef0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
14f00 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65 64   pPager) = saved
14f10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14f30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14f40 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
14f50 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
14f60 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
14f70 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
14f80 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ULL;.          r
14f90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14fa0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
14fb0 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
14fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14fd0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
14fe0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
14ff0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
15000 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
15010 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
15020 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  ;.        pPg->n
15030 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
15040 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
15050 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
15060 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
15070 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
15080 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
15090 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
150a0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
150b0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
150c0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
150d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
150e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
150f0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
15100 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
15110 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
15120 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
15130 20 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e     TRACE4("APPEN
15140 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
15150 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
15160 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
15170 72 2d 3e 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67  r->fd.h, pPg->pg
15180 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
15190 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  c);.    }.    if
151a0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
151b0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
151c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
151d0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 69 6e     }.    pPg->in
151e0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 7d  Journal = 1;.  }
151f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74  ..  /* If the st
15200 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15210 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
15220 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
15230 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  t,.  ** then wri
15240 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
15250 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
15260 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
15270 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ote that.  ** th
15280 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
15290 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
152a0 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
152b0 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
152c0 6d 61 74 0a 20 20 2a 2a 20 69 6e 20 74 68 61 74  mat.  ** in that
152d0 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
152e0 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
152f0 68 65 61 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  header..  */.  i
15300 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
15310 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
15320 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
15330 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
15340 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
15350 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
15360 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
15370 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
15380 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
15390 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d     if( pPager->m
153a0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 50 67  emDb ){.      Pg
153b0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
153c0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
153d0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
153e0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
153f0 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
15400 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
15410 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
15420 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
15430 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
15440 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
15450 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
15460 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
15470 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
15480 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
15490 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
154a0 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
154b0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
154c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
154d0 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fd.h, pPg->pgno)
154e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
154f0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
15500 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
15510 34 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  4);.      CODEC(
15520 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
15530 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
15540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15550 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
15560 3e 73 74 66 64 2c 20 28 28 63 68 61 72 2a 29 70  >stfd, ((char*)p
15570 44 61 74 61 29 2d 34 2c 20 70 50 61 67 65 72 2d  Data)-4, pPager-
15580 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20  >pageSize+4);.  
15590 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
155a0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
155b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e   %d\n", pPager->
155c0 66 64 2e 68 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fd.h, pPg->pgno)
155d0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
155e0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
155f0 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
15600 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15610 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
15620 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
15630 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15640 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
15650 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
15660 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20  RR_FULL;.       
15670 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15680 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
15690 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
156a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
156b0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
156c0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
156d0 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
156e0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
156f0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a  >pgno&7);.    }.
15700 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
15710 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
15720 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
15730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
15740 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
15750 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
15760 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
15770 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
15780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
15790 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
157a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
157b0 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  b && pPager->dbS
157c0 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
157d0 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
157e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
157f0 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
15800 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15810 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
15820 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
15830 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
15840 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
15850 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
15860 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70  d.** to sqlite3p
15870 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49  ager_write().  I
15880 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
15890 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
158a0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
158b0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
158c0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
158d0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
158e0 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69  _iswriteable(voi
158f0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
15900 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
15910 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
15920 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
15930 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
15940 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
15950 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
15960 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
15970 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
15980 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
15990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
159a0 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28  pager_overwrite(
159b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
159c0 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
159d0 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a  pData){.  void *
159e0 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pPage;.  int rc;
159f0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
15a00 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
15a10 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b  , pgno, &pPage);
15a20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
15a40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
15a50 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
15a60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15a70 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
15a80 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20  y(pPage, pData, 
15a90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15ab0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
15ac0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
15ad0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15ae0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
15af0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
15b00 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
15b10 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
15b20 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
15b30 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
15b40 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
15b50 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
15b60 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
15b70 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
15b80 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
15b90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
15ba0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
15bb0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
15bc0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
15bd0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
15be0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
15bf0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
15c00 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
15c10 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
15c20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
15c30 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
15c40 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
15c50 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
15c60 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
15c70 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
15c80 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
15c90 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
15ca0 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
15cb0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
15cc0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
15cd0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
15ce0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
15cf0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
15d00 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
15d10 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
15d20 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15d30 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
15d40 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
15d50 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
15d60 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
15d70 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
15d80 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
15d90 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
15da0 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
15db0 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
15dc0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
15dd0 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
15de0 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
15df0 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
15e00 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
15e10 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
15e20 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
15e30 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
15e40 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
15e50 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
15e60 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
15e70 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
15e80 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
15e90 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
15ea0 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
15eb0 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
15ec0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
15ed0 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
15ee0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
15ef0 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
15f00 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
15f10 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
15f20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
15f30 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
15f40 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
15f50 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
15f60 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
15f70 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
15f80 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
15f90 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
15fa0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
15fb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
15fc0 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
15fd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
15fe0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
15ff0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
16000 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 72  Pager->memDb ) r
16010 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20  eturn;..  pPg = 
16020 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
16030 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50  ger, pgno);.  pP
16040 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
16050 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
16060 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29   && pPg->dirty )
16070 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
16080 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
16090 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
160a0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
160b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
160c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
160d0 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
160e0 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
160f0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
16100 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
16110 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
16120 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
16130 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
16140 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
16150 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
16160 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
16170 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
16180 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
16190 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
161a0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
161b0 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
161c0 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
161d0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
161e0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
161f0 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
16200 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
16210 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
16220 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
16230 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
16240 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
16250 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
16260 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
16270 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
16280 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
16290 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
162a0 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
162b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
162c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
162d0 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
162e0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
162f0 20 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 66   pgno, pPager->f
16300 64 2e 68 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  d.h);.      pPg-
16310 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
16320 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
16330 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
16340 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
16350 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
16360 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
16370 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
16380 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
16390 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
163a0 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
163b0 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
163c0 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
163d0 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
163e0 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
163f0 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
16400 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
16410 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
16420 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
16430 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ck(void *pData){
16440 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
16450 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
16460 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
16470 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
16480 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ger;..  if( pPag
16490 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
164a0 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
164b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
164c0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
164d0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
164e0 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
164f0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
16500 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6d 65  ck || pPager->me
16510 6d 44 62 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  mDb ) return;.  
16520 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
16530 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
16540 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
16550 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
16560 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16570 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
16580 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
16590 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
165a0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
165b0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
165c0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
165d0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
165e0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
165f0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
16600 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
16610 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
16620 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
16630 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
16640 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
16650 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f  }.    TRACE3("DO
16660 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
16670 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
16680 67 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 72 2d  g->pgno, pPager-
16690 3e 66 64 2e 68 29 3b 0a 20 20 7d 0a 20 20 69 66  >fd.h);.  }.  if
166a0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
166b0 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
166c0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
166d0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
166e0 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  tmtSize ){.    a
166f0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
16700 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
16710 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
16720 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
16730 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16740 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
16750 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
16760 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
16770 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
16780 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
16790 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
167a0 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  pPg);.  }.}.../*
167b0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
167c0 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
167d0 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
167e0 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
167f0 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
16800 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
16810 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
16820 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
16830 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
16840 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
16850 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pStmt = 0;.}../*
16860 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
16870 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
16880 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
16890 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
168a0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
168b0 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
168c0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
168d0 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
168e0 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
168f0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
16900 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
16910 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
16920 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
16930 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
16940 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
16950 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
16960 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
16970 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
16980 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
16990 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f  Mask==PAGER_ERR_
169a0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
169b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
169c0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
169d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
169e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
169f0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
16a00 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
16a10 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
16a20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
16a30 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
16a40 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
16a50 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
16a60 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
16a70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
16a80 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
16a90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16aa0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52  _ERROR;.  }.  TR
16ab0 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
16ac0 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68  n", pPager->fd.h
16ad0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
16ae0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50  >memDb ){.    pP
16af0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
16b00 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
16b10 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
16b20 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63  ( pPg ){.      c
16b30 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
16b40 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
16b50 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
16b60 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
16b70 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
16b80 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
16b90 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
16ba0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
16bb0 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
16bc0 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
16bd0 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
16be0 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ty;.    }.#ifnde
16bf0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
16c00 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
16c10 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
16c20 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
16c30 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
16c40 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
16c50 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
16c60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
16c70 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
16c80 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
16c90 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
16ca0 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
16cb0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
16cc0 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
16cd0 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
16ce0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
16cf0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
16d00 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
16d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16d20 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
16d30 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
16d40 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20   ){.    /* Exit 
16d50 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64  early (without d
16d60 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f  oing the time-co
16d70 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f  nsuming sqlite3O
16d80 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20  sSync() calls). 
16d90 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68     ** if there h
16da0 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  ave been no chan
16db0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
16dc0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
16dd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16de0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
16df0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
16e00 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
16e10 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
16e20 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
16e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
16e40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16e50 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
16e60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
16e70 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72  ager_sync(pPager
16e80 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
16e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16ea0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f   goto commit_abo
16eb0 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  rt;.  }.  rc = p
16ec0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
16ed0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
16ee0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
16ef0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
16f00 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
16f10 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
16f20 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20  rong during the 
16f30 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
16f40 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72    */.commit_abor
16f50 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  t:.  sqlite3page
16f60 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
16f70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
16f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
16f90 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
16fa0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
16fb0 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
16fc0 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
16fd0 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
16fe0 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
16ff0 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
17000 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
17010 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
17020 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
17030 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17040 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
17050 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
17060 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
17070 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
17080 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
17090 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45  protocol (SQLITE
170a0 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e  _PROTOCOL) or un
170b0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
170c0 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
170d0 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
170e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
170f0 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
17100 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
17110 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
17120 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
17130 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
17140 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
17150 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
17160 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
17170 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
17180 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
17190 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
171a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
171b0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
171c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
171d0 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28  nt rc;.  TRACE2(
171e0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
171f0 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a   pPager->fd.h);.
17200 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6d 65    if( pPager->me
17210 6d 44 62 20 29 7b 0a 20 20 20 20 50 67 48 64 72  mDb ){.    PgHdr
17220 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
17230 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
17240 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
17250 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
17260 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73  *pHist;.      as
17270 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73  sert( !p->always
17280 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
17290 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20    if( !p->dirty 
172a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
172b0 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
172c0 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
172d0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72  p, pPager))->pOr
172e0 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ig );.        as
172f0 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
17300 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
17310 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
17320 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  pStmt );.       
17330 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17340 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20   }..      pHist 
17350 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
17360 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  p, pPager);.    
17370 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
17380 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  ig ){.        me
17390 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
173a0 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f  TA(p), pHist->pO
173b0 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  rig, pPager->pag
173c0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
173d0 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b  TRACE3("ROLLBACK
173e0 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e  -PAGE %d of %d\n
173f0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 50 61 67  ", p->pgno, pPag
17400 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20  er->fd.h);.     
17410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17420 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
17430 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
17440 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 50 61 67  ", p->pgno, pPag
17450 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20 20 20 20  er->fd.h);.     
17460 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69   }.      clearHi
17470 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
17480 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30      p->dirty = 0
17490 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75  ;.      p->inJou
174a0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
174b0 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  p->inStmt = 0;. 
174c0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d       p->pPrevStm
174d0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74  t = p->pNextStmt
174e0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
174f0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
17500 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
17510 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
17520 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
17530 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17540 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
17550 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50     .    }.    pP
17560 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
17570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
17580 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ize = pPager->or
17590 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65  igDbSize;.    me
175a0 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
175b0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
175c0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
175d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
175e0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
175f0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
17600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
17610 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
17620 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
17630 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
17640 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
17650 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
17660 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
17670 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
17680 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17690 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
176a0 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20  ->errMask!=0 && 
176b0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
176c0 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20  =PAGER_ERR_FULL 
176d0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
176e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
176f0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
17700 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
17710 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
17720 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
17730 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
17740 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
17750 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
17760 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
17770 20 20 69 6e 74 20 72 63 32 2c 20 72 63 33 3b 0a    int rc2, rc3;.
17780 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
17790 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
177a0 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70  er);.    rc2 = p
177b0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
177c0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6f 72  ager, pPager->or
177d0 69 67 44 62 53 69 7a 65 29 3b 0a 20 20 20 20 72  igDbSize);.    r
177e0 63 33 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  c3 = pager_unwri
177f0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
17800 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
17820 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69  c = rc2;.      i
17830 66 28 20 72 63 33 20 29 20 72 63 20 3d 20 72 63  f( rc3 ) rc = rc
17840 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  3;.    }.  }else
17850 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
17860 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
17870 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
17880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17890 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
178a0 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d  RRUPT;  /* bkpt-
178b0 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 70  CORRUPT */.    p
178c0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
178d0 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  = PAGER_ERR_CORR
178e0 55 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  UPT;.  }.  pPage
178f0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
17900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17910 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
17920 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
17930 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
17940 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
17950 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
17960 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
17970 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
17980 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
17990 69 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64  ite3pager_isread
179a0 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
179b0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
179c0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
179d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
179e0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
179f0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
17a00 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
17a10 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65  int *sqlite3page
17a20 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
17a30 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
17a40 20 69 6e 74 20 61 5b 39 5d 3b 0a 20 20 61 5b 30   int a[9];.  a[0
17a50 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
17a60 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
17a70 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
17a80 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
17a90 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
17aa0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
17ab0 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
17ac0 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
17ad0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20  ger->errMask;.  
17ae0 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
17af0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
17b00 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
17b10 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f  [8] = pPager->nO
17b20 76 66 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  vfl;.  return a;
17b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
17b40 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
17b50 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
17b60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
17b70 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
17b80 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
17b90 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
17ba0 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
17bb0 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
17bc0 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
17bd0 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
17be0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
17bf0 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
17c00 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
17c10 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
17c20 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
17c30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
17c40 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61  er_stmt_begin(Pa
17c50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
17c60 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
17c70 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
17c80 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73  NAME_SIZE];.  as
17c90 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
17ca0 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
17cb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
17cc0 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41  Size>=0 );.  TRA
17cd0 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
17ce0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2d 3e 66  %d\n", pPager->f
17cf0 64 2e 68 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d.h);.  if( pPag
17d00 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20  er->memDb ){.   
17d10 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
17d20 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
17d30 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
17d40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
17d50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17d60 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
17d70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17d80 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
17d90 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
17da0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
17db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17dc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17dd0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
17de0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
17df0 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
17e00 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17e10 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
17e20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
17e30 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17e40 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
17e50 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
17e60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17e70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
17e80 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
17e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
17ea0 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
17eb0 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
17ec0 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
17ed0 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
17ee0 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
17ef0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17f00 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
17f10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
17f20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
17f30 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
17f40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17f50 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
17f60 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
17f70 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
17f80 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
17f90 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
17fa0 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
17fb0 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
17fc0 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
17fd0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
17fe0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
17ff0 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50  ntemp(zTemp, &pP
18000 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
18010 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
18020 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
18030 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
18040 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
18050 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
18060 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
18070 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
18080 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
18090 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
180a0 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
180b0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
180c0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
180d0 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
180e0 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
180f0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
18100 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18110 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
18120 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
18130 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
18140 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67  _stmt_commit(Pag
18150 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
18160 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
18170 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
18180 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
18190 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
181a0 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 70  -COMMIT %d\n", p
181b0 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b 0a 20 20  Pager->fd.h);.  
181c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
181d0 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71  emDb ){.      sq
181e0 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
181f0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
18200 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
18210 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65  sTruncate(&pPage
18220 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a  r->stfd, 0); */.
18230 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
18240 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
18250 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  t );.      pPage
18260 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
18270 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50      }.    for(pP
18280 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
18290 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
182a0 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  {.      pNext = 
182b0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
182c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
182d0 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20  g->inStmt );.   
182e0 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
182f0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
18300 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
18310 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
18320 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
18330 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
18340 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
18350 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
18360 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
18370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
18380 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
18390 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
183a0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
183b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
183c0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
183d0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
183e0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
183f0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
18400 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
18410 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
18420 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
18430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18440 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
18450 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
18460 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
18470 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
18480 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
18490 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
184a0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
184b0 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
184c0 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
184d0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2e 68 29 3b  , pPager->fd.h);
184e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
184f0 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 20 20  >memDb ){.      
18500 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
18510 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
18520 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
18530 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  g=pPg->pNextStmt
18540 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
18550 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
18560 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
18570 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
18580 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
18590 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
185a0 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
185b0 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
185c0 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
185d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
185e0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
185f0 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
18600 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
18610 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
18620 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18630 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
18640 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
18650 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d  tSize;.      mem
18660 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
18670 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
18680 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18690 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
186a0 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
186b0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
186c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
186d0 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
186e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
186f0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
18700 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
18710 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
18720 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
18730 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
18740 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
18750 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
18760 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
18770 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
18780 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  e3pager_filename
18790 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
187a0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
187b0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
187c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
187d0 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
187e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
187f0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
18800 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72  sqlite3pager_dir
18810 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
18820 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
18830 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
18840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18850 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
18860 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
18870 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
18880 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
18890 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65  ager_journalname
188a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
188b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
188c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
188d0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
188e0 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
188f0 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
18900 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63  3pager_set_codec
18910 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
18920 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  r,.  void (*xCod
18930 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
18940 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
18950 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
18960 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
18970 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
18980 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
18990 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
189a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
189b0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
189c0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
189d0 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
189e0 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
189f0 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
18a00 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
18a10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
18a20 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
18a30 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
18a40 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64  *pPager){.  void
18a50 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72   *pPage;.  PgHdr
18a60 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
18a70 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
18a80 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
18a90 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
18aa0 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
18ab0 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ing. */.  rc = s
18ac0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
18ad0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
18ae0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
18af0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
18b00 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
18b10 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
18b20 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
18b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18b40 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65  urn rc;..  /* Re
18b50 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ad the current v
18b60 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e  alue at byte 24.
18b70 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44   */.  pPgHdr = D
18b80 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61  ATA_TO_PGHDR(pPa
18b90 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f  ge);.  change_co
18ba0 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
18bb0 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
18bc0 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  4);..  /* Increm
18bd0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
18be0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
18bf0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
18c00 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
18c10 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73  e_counter++;.  s
18c20 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e 67  tore32bits(chang
18c30 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64  e_counter, pPgHd
18c40 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65  r, 24);..  /* Re
18c50 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
18c60 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73  eference. */.  s
18c70 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
18c80 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  f(pPage);.  retu
18c90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18ca0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
18cb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
18cc0 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
18cd0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
18ce0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
18cf0 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
18d00 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
18d10 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
18d20 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
18d30 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
18d40 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
18d50 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
18d60 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
18d70 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
18d80 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
18d90 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
18da0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
18db0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
18dc0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
18dd0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
18de0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
18df0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
18e00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18e10 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
18e20 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
18e30 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
18e40 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
18e50 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
18e60 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
18e70 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
18e80 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
18e90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18ea0 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
18eb0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
18ec0 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
18ed0 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
18ee0 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
18ef0 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
18f00 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
18f10 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63  e3pager_sync() c
18f20 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  all..*/.int sqli
18f30 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61  te3pager_sync(Pa
18f40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18f50 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18f60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18f70 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
18f80 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
18f90 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
18fa0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
18fb0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
18fc0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
18fd0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
18fe0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
18ff0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
19000 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19010 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
19020 44 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65  D && !pPager->me
19030 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 64  mDb && pPager->d
19040 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
19050 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
19060 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19070 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
19080 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
19090 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
190a0 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
190b0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
190c0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
190d0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
190e0 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
190f0 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
19100 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
19110 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
19120 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
19130 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
19140 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
19150 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
19160 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
19170 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
19180 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
19190 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
191a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
191b0 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
191c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
191d0 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
191e0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
191f0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
19200 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19210 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
19220 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
19230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19240 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
19250 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
19260 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
19270 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
19280 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
19290 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
192a0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
192b0 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
192c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
192d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
192e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
192f0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
19300 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
19310 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
19320 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19330 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
19340 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
19350 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
19360 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
19370 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
19380 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
19390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
193a0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
193b0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
193c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
193d0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
193e0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
193f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19400 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66  sSync(&pPager->f
19410 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  d);.    }..    p
19420 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
19430 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
19440 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
19450 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
19460 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19470 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
19480 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
19490 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
194a0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
194b0 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
194c0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
194d0 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
194e0 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
194f0 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
19500 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
19510 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
19520 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
19530 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
19540 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  t sqlite3pager_l
19550 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
19560 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20  pPager){.#ifdef 
19570 4f 53 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e  OS_TEST.  return
19580 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e   pPager->fd->fd.
19590 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a  locktype;.#else.
195a0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
195b0 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65  >fd.locktype;.#e
195c0 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ndif.}.#endif..#
195d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
195e0 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  T./*.** Print a 
195f0 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
19600 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
19610 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
19620 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
19630 69 74 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d  ite3pager_refdum
19640 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
19650 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
19660 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
19670 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
19680 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
19690 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
196a0 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
196b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
196c0 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25  ugPrintf("PAGE %
196d0 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  3d addr=%p nRef=
196e0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70  %d\n", .       p
196f0 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f  Pg->pgno, PGHDR_
19700 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
19710 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a  g->nRef);.  }.}.
19720 23 65 6e 64 69 66 0a                             #endif.