/ Hex Artifact Content
Login

Artifact 7ea0549f435e9de6d13b18ad4e4f65c512dff477:


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 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  Int.h"../*.** Ma
0370: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
0380: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
0390: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
03a0: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
03b0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
03c0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
03d0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
03e0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
03f0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
0400: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
0410: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
0420: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
0430: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
0440: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
0450: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
0460: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
0470: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0480: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
0490: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
04a0: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
04b0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
04c0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
04d0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
04e0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
04f0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
0500: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
0510: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
0520: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0530: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
0540: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
0550: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
0560: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
0570: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
0580: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
0590: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
05a0: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
05b0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
05c0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
05d0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
05e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
05f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0600: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0620: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0630: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0640: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0650: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0660: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0670: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0680: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
06b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
06c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
06d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
06e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
06f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0710: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0720: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0730: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0740: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0750: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0770: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0780: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0790: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
07c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
07d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0800: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0810: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0820: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0830: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0840: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0850: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0880: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0890: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
08a0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
08d0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
08e0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
08f0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0910: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0920: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0930: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0960: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0970: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0980: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0990: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
09a0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
09b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
09c0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
09d0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
09e0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0a10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0a20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0a30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0a50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0a60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0a70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0a90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0aa0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0ab0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0ac0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0ad0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ae0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0af0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0b00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0b10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0b20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0b30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0b70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0b80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0ba0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0bb0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0bc0: 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ove or.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
0bf0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68  rnal file and th
0c00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
0c10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c20: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20          will be 
0c30: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0c40: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0c50: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0c60: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0c70: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0c80: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
0c90: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61   occurs, the sta
0ca0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0cb0: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0cc0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
0cd0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
0ce0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0cf0: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0d00: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0d10: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0d20: 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  o PAGER_UNLOCK. 
0d30: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
0d40: 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 50  ** that sqlite3P
0d50: 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
0d60: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0d70: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0d80: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0d90: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0da0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
0db0: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0dc0: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0dd0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0de0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0df0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0e00: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0e10: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0e20: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e30: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0e40: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0e50: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  D means that the
0e60: 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f  re is an open ro
0e70: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
0e80: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0e90: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0ea0: 53 49 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f  SIVE occurs befo
0eb0: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a  re any changes.*
0ec0: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  * are made to th
0ed0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
0ee0: 20 74 68 6f 75 67 68 20 77 72 69 74 65 73 20 74   though writes t
0ef0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0f00: 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73  * journal occurs
0f10: 20 77 69 74 68 20 6a 75 73 74 20 50 41 47 45 52   with just PAGER
0f20: 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66 74 65  _RESERVED.  Afte
0f30: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
0f40: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
0f50: 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  r sqlite3PagerCo
0f60: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20  mmitPhaseTwo(), 
0f70: 74 68 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f  the state can go
0f80: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
0f90: 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20  HARED,.** or it 
0fa0: 63 61 6e 20 73 74 61 79 20 61 74 20 50 41 47 45  can stay at PAGE
0fb0: 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66 20 77  R_EXCLUSIVE if w
0fc0: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
0fd0: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
0fe0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
0ff0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1000: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1010: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1020: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1030: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1040: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
1050: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
1060: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
1070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1080: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
1090: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10a0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
10b0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
10c0: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41        5../*.** A
10d0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
10e0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
10f0: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
1100: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
1110: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
1120: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
1130: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
1140: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
1150: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1160: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
1170: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
1180: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
1190: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
11a0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
11b0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
11c0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
11d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
11e0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
11f0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
1200: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
1210: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
1220: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
1230: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
1240: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
1250: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
1260: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
1270: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
1280: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
1290: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
12a0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
12b0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
12c0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
12d0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
12e0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
12f0: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
1300: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
1310: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
1320: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
1330: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
1340: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
1350: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
1360: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
1370: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
1380: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
1390: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
13a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
13b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
13c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
13d0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
13e0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
13f0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
1400: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
1410: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
1420: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
1430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
1440: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
1450: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
1460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1470: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
1480: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
1490: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
14a0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
14b0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
14c0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14d0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
14e0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
14f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1500: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1520: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
1530: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1540: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
1550: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1560: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
1570: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1580: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
1590: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
15a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15b0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
15c0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
15d0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
15e0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
15f0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
1600: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
1610: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
1620: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
1630: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1640: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
1650: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
1660: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1670: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
16a0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
16b0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
16c0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
16d0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
16e0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
16f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
1700: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
1710: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
1720: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
1730: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1750: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
1760: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
1770: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
17a0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
17b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ournal */.};../*
17c0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
17d0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
17e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
17f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1800: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
1810: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72  *.**   Pager.err
1820: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
1830: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
1840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1850: 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49   or.**   or SQLI
1860: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1870: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1880: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1890: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
18a0: 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75  **   and is retu
18b0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
18c0: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
18d0: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
18e0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49  .  The.**   SQLI
18f0: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1900: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1910: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1920: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1930: 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20  l the.**   next 
1940: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
1950: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
1960: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
1970: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20  che. Also,.**   
1980: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1990: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
19a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
19c0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20  erLookup().**   
19d0: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
19e0: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
19f0: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  cessfully..**.**
1a00: 20 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62   dbSizeValid, db
1a10: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1a20: 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a  , dbFileSize.**.
1a30: 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68  **   Managing th
1a40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1a50: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1a60: 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ages is a little
1a70: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
1a80: 20 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20     The variable 
1a90: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1aa0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ab0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1ac0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
1ad0: 20 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79   image currently
1ae0: 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68   contains. As th
1af0: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1b00: 20 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b   grows or shrink
1b10: 73 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69  s this.**   vari
1b20: 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e  able is updated.
1b30: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1b40: 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63  ger.dbFileSize c
1b50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
1b60: 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73  er.**   of pages
1b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b80: 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20   file. This may 
1b90: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
1ba0: 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a  m Pager.dbSize.*
1bb0: 2a 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65  *   if some page
1bc0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1bd0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1be0: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1bf0: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1c00: 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65  *   out from the
1c10: 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63   cache to the ac
1c20: 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  tual file on dis
1c30: 6b 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61  k. Or if the ima
1c40: 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20  ge has been.**  
1c50: 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e   truncated by an
1c60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1c70: 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  uum operation. T
1c80: 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53  he Pager.dbOrigS
1c90: 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1ca0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
1cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1cd0: 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75  mage when the cu
1ce0: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73  rrent.**   trans
1cf0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
1d00: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
1d10: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
1d20: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
1d30: 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61  is.**   only gua
1d40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1d50: 72 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f  rrect if the boo
1d60: 6c 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  lean Pager.dbSiz
1d70: 65 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a  eValid is true..
1d80: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e  **.**   TODO: Un
1d90: 64 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69  der what conditi
1da0: 6f 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c  ons is dbSizeVal
1db0: 69 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f  id set? Cleared?
1dc0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
1dd0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
1de0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
1df0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1e00: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1e10: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e20: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
1e30: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
1e40: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
1e50: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
1e60: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
1e70: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
1e80: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
1e90: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
1ea0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
1eb0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
1ec0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
1ed0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
1ee0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
1ef0: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
1f00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1f10: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f30: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
1f40: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
1f50: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
1f60: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
1f70: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
1f80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f90: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
1fa0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fb0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
1fc0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
1fd0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
1fe0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
1ff0: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
2000: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
2010: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2020: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
2030: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
2040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2050: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
2060: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
2070: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
2080: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
2090: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
20a0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
20b0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
20c0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
20d0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
20e0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
20f0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64  ted..**.** dbMod
2100: 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  ified.**.**   Th
2110: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2120: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2130: 72 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  r a database pag
2140: 65 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a  e is dirtied..**
2150: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
2160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2170: 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ach transaction.
2180: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75  .**.**   It is u
2190: 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  sed when committ
21a0: 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ing or otherwise
21b0: 20 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61   ending a transa
21c0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74  ction. If.**   t
21d0: 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c  he dbModified fl
21e0: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
21f0: 20 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74   less work has t
2200: 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  o be done..**.**
2210: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a   journalStarted.
2220: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61  **.**   This fla
2230: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2240: 72 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a  r the the main j
2250: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2260: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  . .**.**   The p
2270: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
2280: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
2290: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
22a0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
22b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
22c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22d0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
22e0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
22f0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
2300: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
2310: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2320: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
2330: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
2340: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2350: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
2360: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
2370: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
2380: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
2390: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
23a0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
23b0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
23c0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
23d0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
23e0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
23f0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
2400: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2410: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2420: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
2430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2440: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
2450: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
2460: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2470: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
2480: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
2490: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
24a0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
24d0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
24e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
2500: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
2510: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
2520: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
2530: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
2540: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
2550: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
2560: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
2570: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2580: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
2590: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
25a0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
25b0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
25c0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
25d0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
25e0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
25f0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
2600: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
2610: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
2620: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
2630: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
2640: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
2650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2660: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
2670: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
2680: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26a0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
26b0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
26c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
26d0: 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a  .** doNotSync.**
26e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
26f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
2700: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
2710: 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a  3PagerWrite()..*
2720: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
2730: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
2740: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
2750: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
2760: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
2770: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
2780: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
2790: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
27a0: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
27b0: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
27c0: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
27d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27e0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
27f0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
2800: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
2810: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
2820: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
2830: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
2840: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
2850: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2860: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2870: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
2880: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
2890: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
28a0: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
28b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
28c0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
28d0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
2900: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
2910: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2920: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2930: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2940: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2950: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2960: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2970: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2980: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2990: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
29a0: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
29b0: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29e0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29f0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
2a00: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
2a10: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a20: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a30: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a40: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a60: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a70: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a80: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2ab0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ac0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ad0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ae0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2af0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2b00: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2b10: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b20: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b30: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b40: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b60: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b80: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b90: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2ba0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2bb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bc0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bd0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2be0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bf0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2c00: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2c10: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c20: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c30: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c40: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c50: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c60: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c70: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c80: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c90: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2ca0: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2cb0: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2cc0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2ce0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cf0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2d00: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2d10: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d20: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d30: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d40: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d50: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d60: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d70: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d80: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d90: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2da0: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2db0: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2dc0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2dd0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2de0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2df0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2e00: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2e10: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e20: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e40: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e50: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e60: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e70: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e90: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2ea0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2eb0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ec0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ed0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ee0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ef0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2f00: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2f10: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f30: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f40: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f50: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f70: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f80: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2fa0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fc0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fd0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fe0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2ff0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3010: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3020: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3030: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3040: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3060: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3070: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
3080: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
3090: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30a0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
30b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
30c0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30f0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3100: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
3110: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
3120: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
3130: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
3140: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3150: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
3160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3170: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
3180: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3190: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
31a0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
31b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
31c0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
31d0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
31e0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
31f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
3200: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
3210: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
3220: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
3230: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
3250: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
3260: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
3270: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
3280: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
3290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32a0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
32b0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
32c0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
32d0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
32e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
32f0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3310: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
3320: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
3330: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3340: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
3350: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
3360: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
3370: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
3380: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
3390: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
33a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
33b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
33c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
33d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
33e0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
33f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3400: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
3410: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
3420: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3430: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
3450: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
3460: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
3470: 61 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53  ader */.  PagerS
3480: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
3490: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
34a0: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
34b0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
34c0: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
34d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34e0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
34f0: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
3500: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
3510: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
3520: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
3530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3540: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73  anges */.  u32 s
3550: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3560: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3570: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3580: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3590: 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20  ..  u16 nExtra; 
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
35c0: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
35d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
35e0: 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b  .  i16 nReserve;
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3600: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
3610: 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20  ed bytes at end 
3620: 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  of each page */.
3630: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3650: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
3660: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
3670: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
3680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
36a0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
36b0: 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20    Pgno mxPgno;  
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d0: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
36e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
36f0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
3700: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
3710: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3720: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
3730: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
3740: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3760: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3770: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
3780: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
3790: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
37a0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
37b0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
37c0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
37d0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
37e0: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
37f0: 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20  ndler */.#ifdef 
3800: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
3810: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
3820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
3830: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
3840: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
3850: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
3860: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3870: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
3880: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
3890: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
38a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
38b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
38c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
38d0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
38e0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
38f0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
3900: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3910: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3920: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3930: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3940: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
3950: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
3960: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
3970: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
3980: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
3990: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
39a0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
39b0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
39c0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
39d0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39f0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
3a00: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
3a10: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
3a20: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
3a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3a40: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
3a50: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
3a60: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69  r tmp use */.  i
3a70: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
3a80: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
3a90: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
3aa0: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
3ab0: 66 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68  files */.  PCach
3ac0: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
3ad0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3ae0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
3af0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
3b00: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
3b10: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
3b20: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
3b30: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
3b40: 63 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  cesses */.};../*
3b50: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3b60: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
3b70: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
3b80: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
3b90: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
3ba0: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
3bb0: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
3bc0: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
3bd0: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
3be0: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
3bf0: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
3c00: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3c10: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
3c20: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
3c30: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
3c50: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
3c60: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
3c70: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
3c80: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
3c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3ca0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
3cb0: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
3cc0: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
3cd0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3ce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
3cf0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
3d00: 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65  rnal */.# define
3d10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
3d20: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
3d30: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
3d40: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a  .#endif..../*.**
3d50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3d60: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3d70: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3d80: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3d90: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3da0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3db0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3dc0: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
3dd0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
3de0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
3df0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3e00: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
3e10: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
3e20: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3e30: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3e40: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3e50: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3e60: 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65   being.** writte
3e70: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3e80: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3e90: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3ea0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3eb0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3ec0: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
3ed0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
3ee0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
3ef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
3f00: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
3f10: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
3f20: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3f30: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3f40: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3f50: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3f60: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3f70: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3f80: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3fa0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3fb0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3fc0: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
3fd0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
3fe0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
3ff0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
4000: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
4010: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
4020: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
4030: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
4040: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
4050: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
4060: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
4070: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
4080: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
4090: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
40a0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
40b0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
40c0: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
40d0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
40e0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
40f0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
4100: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
4110: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
4120: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
4130: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
4140: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
4150: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
4160: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
4170: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
4180: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
4190: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
41a0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
41b0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
41c0: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
41d0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
41e0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
41f0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
4200: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
4210: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
4220: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
4230: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
4240: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
4250: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
4260: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
4270: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
4280: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
4290: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
42a0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
42b0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
42c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
42d0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61  ize of the of ea
42e0: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  ch page record i
42f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4300: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65   given by.** the
4310: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
4320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4330: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4340: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4350: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4360: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4370: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
4380: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73  this pager. This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20   is usually the 
43a0: 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73  same .** size as
43b0: 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
43c0: 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20  ector. See also 
43d0: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e  setSectorSize().
43e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
43f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4400: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4410: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4420: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
4430: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
4440: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
4450: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
4460: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
4470: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
4480: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4490: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
44a0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
44b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
44c0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
44d0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
44e0: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
44f0: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4500: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4510: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
4530: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
4540: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
4550: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
4560: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
4570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4580: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
4590: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
45a0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
45b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
45c0: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
45d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
45e0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
45f0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
4600: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
4610: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a  e(pPager) );.*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
4630: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
4640: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
4650: 20 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20   /* A temp-file 
4660: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47  is always in PAG
4670: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20  ER_EXCLUSIVE or 
4680: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
4690: 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
46a0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
46b0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
46c0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
46d0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
46e0: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
46f0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
4700: 79 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d  ys set for temp-
4710: 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
4720: 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
4730: 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ile==0 || pPager
4740: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
4750: 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31  e );..  return 1
4760: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4770: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4780: 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
4790: 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a   to write page *
47a0: 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62  pPg into the sub
47b0: 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70  -journal..** A p
47c0: 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
47d0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
47e0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
47f0: 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
4800: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e  .** or more open
4810: 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20   savepoints for 
4820: 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  which:.**.**   *
4830: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
4840: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
4850: 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53   equal to PagerS
4860: 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20  avepoint.nOrig, 
4870: 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62  and.**   * The b
4880: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
4890: 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d   to the page-num
48a0: 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69  ber is not set i
48b0: 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61  n.**     PagerSa
48c0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
48d0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
48e0: 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73  int subjRequires
48f0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
4900: 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  {.  Pgno pgno = 
4910: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  pPg->pgno;.  Pag
4920: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4930: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
4940: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4950: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
4960: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61  nt; i++){.    Pa
4970: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
4980: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
4990: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
49a0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
49b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
49c0: 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53  tvecTest(p->pInS
49d0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
49e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
49f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
4a00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4a10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4a20: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
4a30: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
4a40: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nal file..*/.sta
4a50: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f  tic int pageInJo
4a60: 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67  urnal(PgHdr *pPg
4a70: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
4a80: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
4a90: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  g->pPager->pInJo
4aa0: 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
4ab0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
4ac0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4ad0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4ae0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4af0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
4b00: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4b10: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4b20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4b30: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
4b40: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
4b50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4b60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4b80: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4b90: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4ba0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4bb0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4bc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
4bd0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
4be0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
4bf0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
4c00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
4c10: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
4c20: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
4c30: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
4c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4c50: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
4c60: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
4c70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
4c90: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4ca0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
4cb0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
4cc0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
4cd0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
4ce0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
4cf0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
4d00: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
4d10: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4d20: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
4d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4d40: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4d50: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
4d60: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
4d70: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4d80: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
4d90: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
4da0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
4db0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
4dc0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
4dd0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
4de0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
4df0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4e00: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
4e10: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
4e20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
4e30: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
4e40: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
4e50: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
4e60: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
4e70: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
4e80: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
4e90: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
4ea0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
4eb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
4ec0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
4ed0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
4ee0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
4ef0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
4f00: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
4f10: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
4f20: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
4f30: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
4f40: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
4f50: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
4f60: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
4f70: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
4f80: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
4f90: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
4fa0: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
4fb0: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
4fc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
4fd0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
4fe0: 66 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20  f( !isOpen(pFd) 
4ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5000: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
5010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
5020: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
5030: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5040: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
5050: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
5060: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
5070: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
5080: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
5090: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
50a0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
50b0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
50c0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
50d0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
50e0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
50f0: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
5100: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
5110: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
5120: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
5130: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
5140: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
5150: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
5160: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
5170: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
5180: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
5190: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
51a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
51b0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
51c0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
51d0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
51e0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
51f0: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
5200: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
5210: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
5220: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
5230: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
5240: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
5250: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
5260: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
5270: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
5280: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
5290: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
52a0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
52b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
52c0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
52d0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
52e0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
52f0: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
5300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5310: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
5320: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
5330: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
5340: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
5350: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
5360: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
5370: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
5380: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
53b0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
53c0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
53f0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
5400: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
5410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
5420: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
5430: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
5440: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
5450: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
5460: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
5470: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
5480: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
5490: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
54a0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
54b0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
54c0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
54d0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
54e0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
54f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
5500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5510: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
5520: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
5530: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
5540: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
5550: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
5560: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
5570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
5580: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
5590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
55a0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
55b0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
55c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
55d0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
55e0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
55f0: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
5600: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
5610: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
5620: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
5630: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
5640: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
5650: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
5660: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
5670: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
5680: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
5690: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
56a0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
56b0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
56c0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
56d0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
56e0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
56f0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
5700: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
5710: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5720: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
5730: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
5740: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
5750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5760: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
5770: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5780: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5790: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
57a0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
57b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
57c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
57d0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
57e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
57f0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
5800: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
5810: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
5820: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
5830: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
5840: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
5850: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
5860: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
5870: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
5880: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
5890: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
58a0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
58b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
58c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
58d0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
58e0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
58f0: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
5900: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
5910: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
5920: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
5930: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
5940: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
5950: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
5960: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
5970: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5980: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
5990: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
59a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
59b0: 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  ode.      || (pP
59c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
59d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
59e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
59f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
5a00: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
5a10: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
5a20: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
5a40: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
5a50: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
5a60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
5a70: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
5a80: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
5a90: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
5aa0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
5ab0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
5ac0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
5ad0: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
5ae0: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
5af0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5b00: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
5b10: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
5b20: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
5b30: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
5b40: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
5b50: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
5b60: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
5b70: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
5b80: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5b90: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
5ba0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
5bb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5bc0: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
5bd0: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5be0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
5bf0: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
5c00: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
5c10: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
5c20: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
5c30: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
5c40: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
5c50: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
5c60: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
5c70: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
5c80: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
5c90: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
5ca0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
5cb0: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
5cc0: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
5cd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
5ce0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
5cf0: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
5d00: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
5d10: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
5d20: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
5d30: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
5d40: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
5d50: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
5d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
5d70: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
5d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5d90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
5da0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
5db0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
5dc0: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
5dd0: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
5de0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
5df0: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
5e00: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
5e10: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
5e20: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
5e30: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
5e40: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5e50: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
5e60: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
5e70: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
5e80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5e90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
5ea0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
5eb0: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
5ec0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
5ed0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
5ee0: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
5ef0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
5f00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
5f10: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
5f20: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5f30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5f40: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5f50: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
5f60: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
5f70: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
5f80: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
5fb0: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
5fe0: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
5ff0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
6000: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
6010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
6020: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
6030: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
6040: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
6050: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
6070: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
6080: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
6090: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
60c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
60d0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
60e0: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
60f0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6100: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6110: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
6120: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
6130: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6140: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6150: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
6160: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
6170: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6180: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
6190: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
61a0: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
61b0: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
61c0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
61d0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
61e0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
61f0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
6200: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
6210: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
6220: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
6230: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
6240: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
6250: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
6260: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6270: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
6280: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
6290: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
62a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
62b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
62c0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
62d0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
62e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
62f0: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
6300: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
6310: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
6320: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
6330: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
6340: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
6350: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
6360: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
6370: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
6380: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
6390: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
63a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
63b0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
63c0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
63d0: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
63e0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
63f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
6400: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
6410: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
6420: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
6430: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
6440: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
6450: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
6460: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
6470: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
6490: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
64a0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
64b0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
64c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
64d0: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
64e0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
64f0: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
6500: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
6510: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
6520: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
6530: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
6540: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
6550: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
6560: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
6570: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
6610: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
6620: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
6630: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
6640: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
6650: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
6660: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
6670: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
6680: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6690: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
66a0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
66b0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
66c0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
66d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
66e0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
66f0: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
6700: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6710: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
6720: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
6730: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
6740: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
6750: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
6760: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
6770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
6780: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
6790: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
67a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
67b0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
67c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
67d0: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
67e0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
67f0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
6800: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
6810: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
6820: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
6830: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
6840: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
6850: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
6860: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
6870: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
6880: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
6890: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
68a0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
68b0: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
68c0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
68d0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
68e0: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
68f0: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
6900: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
6910: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
6920: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
6930: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
6940: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
6950: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6960: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
6970: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
6980: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
6990: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
69a0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
69b0: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
69c0: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
69d0: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
69e0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
69f0: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
6a00: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
6a10: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
6a20: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
6a30: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
6a40: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6a50: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
6a60: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
6a80: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
6a90: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
6aa0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
6ab0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
6ac0: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
6ad0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6ae0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
6af0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
6b00: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
6b10: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
6b20: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
6b30: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
6b40: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
6b50: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
6b60: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
6b70: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
6b80: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
6b90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
6ba0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
6bd0: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
6be0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
6bf0: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
6c00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6c10: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
6c20: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
6c30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
6c40: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
6c50: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
6c60: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
6c70: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
6c80: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
6c90: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
6ca0: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6cc0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
6cd0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
6ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
6cf0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
6d00: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
6d10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6d20: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6d30: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
6d40: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
6d50: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
6d60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6d70: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
6d80: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
6d90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
6da0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
6db0: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
6dc0: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  LY|pPager->sync_
6dd0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  flags);.    }.. 
6de0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
6df0: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
6e00: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6e10: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
6e20: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
6e30: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
6e40: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
6e50: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
6e60: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
6e70: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
6e80: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
6e90: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
6ea0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
6eb0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
6ec0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
6ed0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
6ee0: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
6ef0: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
6f00: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
6f10: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
6f20: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
6f30: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
6f40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6f50: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
6f60: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
6f70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6f80: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6f90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
6fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
6fb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
6fc0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
6fd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6fe0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6ff0: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
7000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7010: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7020: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
7030: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
7040: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
7050: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7060: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
7070: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
7080: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
7090: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
70a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
70b0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
70c0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
70d0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
70e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
70f0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
7100: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
7110: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
7120: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
7130: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
7140: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
7150: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
7160: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
7170: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
7180: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
7190: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
71a0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
71b0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
71c0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
71d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
71e0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
71f0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
7200: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
7210: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
7220: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
7230: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
7240: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
7250: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
7260: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
7270: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
7280: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
7290: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
72a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
72b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
72e0: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
72f0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
7300: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
7310: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
7320: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
7330: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
7340: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
7350: 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ze;     /* Size 
7360: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
7370: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
7380: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
73b0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
73c0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
73d0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7400: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
7410: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
7420: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
7430: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
7440: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
7450: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
7460: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7470: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
7480: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
7490: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
74a0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
74b0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
74c0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
74d0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
74e0: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
74f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
7500: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
7510: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
7520: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
7530: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
7540: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
7550: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
7560: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
7570: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
7580: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
7590: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
75a0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
75b0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
75c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
75d0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
75e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
7600: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
7610: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7620: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
7630: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
7640: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
7650: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
7660: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
7670: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
7680: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
7690: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
76a0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
76b0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
76c0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
76d0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
76e0: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
76f0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
7700: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
7710: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
7720: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
7730: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
7740: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
7750: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
7760: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
7770: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
7780: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
7790: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
77a0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
77b0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
77c0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
77d0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
77e0: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
77f0: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
7800: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
7810: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
7820: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
7830: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7840: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
7850: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
7860: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
7870: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
7880: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
7890: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
78a0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
78b0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
78c0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
78d0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
78e0: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
78f0: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7900: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
7910: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
7920: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
7930: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
7940: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
7950: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
7960: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
7970: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
7980: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
7990: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
79a0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
79b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
79c0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
79d0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
79e0: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
79f0: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7a00: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
7a10: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7a20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
7a30: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7a40: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
7a50: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
7a60: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7a70: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
7a80: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7a90: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7aa0: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
7ab0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7ac0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
7ad0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7ae0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7af0: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65  ND) .  ){.    me
7b00: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
7b10: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7b20: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7b30: 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69  c));.    put32bi
7b40: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7b50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b60: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
7b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
7b80: 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c  mset(zHeader, 0,
7b90: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7ba0: 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a  Magic)+4);.  }..
7bb0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
7bc0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
7bd0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
7be0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7bf0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
7c00: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
7c10: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7c20: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7c30: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7c40: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
7c70: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
7c80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7c90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7ca0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7cb0: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
7cc0: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
7cd0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7ce0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
7cf0: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
7d00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7d10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d20: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
7d30: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
7d40: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
7d50: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7d60: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7d70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7d80: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
7d90: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
7da0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7db0: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7dc0: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7dd0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7de0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7df0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7e00: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7e10: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7e20: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
7e30: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
7e40: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
7e50: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
7e60: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
7e70: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
7e80: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7e90: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7ea0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7eb0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ec0: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7ed0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7ee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ef0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
7f00: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
7f10: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
7f20: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
7f30: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
7f40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
7f50: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
7f60: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
7f70: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
7f80: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
7f90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
7fa0: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
7fb0: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
7fc0: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
7fd0: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
7fe0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
7ff0: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
8000: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
8010: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
8020: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
8030: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
8040: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
8050: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
8060: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
8070: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
8080: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
8090: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
80a0: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
80b0: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
80c0: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
80d0: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
80e0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
80f0: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
8100: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
8110: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
8120: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
8130: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
8140: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
8150: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
8160: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
8170: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
8180: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
8190: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
81a0: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
81b0: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
81c0: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
81d0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
81e0: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
81f0: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
8200: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
8210: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
8220: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
8230: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8240: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
8250: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
8260: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
8270: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
8280: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
8290: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
82a0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
82b0: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
82c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
82d0: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
82e0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
82f0: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
8300: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
8310: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
8320: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
8330: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8340: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8350: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
8360: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
8370: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
8380: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
8390: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
83a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
83b0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
83c0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
83d0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
83e0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
83f0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
8400: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8410: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
8420: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8430: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
8440: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8450: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
8460: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
8470: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
8480: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
8490: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
84a0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
84b0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
84c0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
84d0: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
84e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
84f0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
8500: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
8510: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
8520: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
8530: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
8540: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
8550: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
8560: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
8570: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
8580: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
8590: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
85a0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
85b0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
85c0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
85d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
85e0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
85f0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
8600: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
8610: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
8620: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
8630: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
8640: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
8650: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
8660: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
8670: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
8680: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
8690: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
86a0: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
86b0: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
86c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
86d0: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
86e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
86f0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
8700: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8710: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8720: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
8730: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
8740: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
8750: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
8760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
8770: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
8780: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8790: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
87a0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
87b0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
87c0: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87e0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
87f0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8800: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8810: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8820: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8830: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
8840: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
8850: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8860: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8870: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8880: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8890: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
88a0: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
88b0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
88c0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
88d0: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8910: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8920: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8930: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
8940: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
8950: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8960: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8970: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8980: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8990: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
89a0: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
89b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
89c0: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
89d0: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
89e0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
89f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8a00: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8a10: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8a20: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8a30: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8a40: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8a50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8a60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8a70: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8a80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8a90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8aa0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8ab0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8ac0: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8ad0: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8ae0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8af0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8b00: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8b10: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8b20: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8b30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8b40: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8b50: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8b60: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8b70: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8b80: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8b90: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8ba0: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8bb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
8bc0: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
8bd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
8be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8bf0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8c00: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8c10: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8c20: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
8c30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8c40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8c50: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
8c60: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8c70: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8c80: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
8c90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ca0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8cb0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8cc0: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8cd0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8ce0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8cf0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8d00: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8d10: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8d30: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8d40: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8d50: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8d60: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8d70: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8d80: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8d90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8da0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8db0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8dc0: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8dd0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8de0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8df0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e00: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8e10: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8e20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e30: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e50: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8e60: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8e70: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8e80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8e90: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8ea0: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8ec0: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8ed0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ee0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8ef0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8f00: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8f10: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8f20: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8f30: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8f40: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8f50: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8f60: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8f70: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8f80: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8f90: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8fa0: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8fb0: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8fc0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8fd0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8fe0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8ff0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
9000: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
9010: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9020: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9040: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
9050: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
9060: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9070: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
9080: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
9090: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
90a0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
90b0: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
90c0: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
90d0: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
90e0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
90f0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
9100: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
9110: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
9120: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9130: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
9140: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
9150: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
9160: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
9170: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
9180: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
9190: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
91a0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
91b0: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
91c0: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
91d0: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
91e0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
91f0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
9200: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
9210: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
9220: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
9230: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
9240: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
9250: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
9260: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9270: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
9280: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
9290: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
92a0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
92b0: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
92c0: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
92d0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
92e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
92f0: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
9300: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
9310: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
9320: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
9330: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
9340: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
9350: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
9360: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
9370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9380: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
9390: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
93a0: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
93b0: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
93c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
93d0: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
93e0: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
93f0: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
9400: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
9410: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
9420: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
9430: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
9440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
9450: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
9460: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
9470: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
9480: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
9490: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
94a0: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
94b0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
94c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
94d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
94e0: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
94f0: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
9500: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
9510: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
9520: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
9530: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
9540: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
9550: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
9560: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
9570: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
9580: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
9590: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
95a0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
95b0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
95c0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
95d0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
95e0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
95f0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
9600: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
9610: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
9620: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
9630: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
9640: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
9650: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
9660: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
9670: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
9680: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
9690: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
96a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
96b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
96c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
96d0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
96e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
96f0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9700: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
9710: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
9720: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
9730: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
9740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
9750: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
9760: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
9770: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9780: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9790: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
97a0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
97b0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
97c0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
97d0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
97e0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
97f0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
9800: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
9810: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
9820: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
9830: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
9840: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
9850: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
9860: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
9870: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
9880: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
9890: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
98a0: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
98b0: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
98c0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
98d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
98e0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
98f0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
9900: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
9910: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9920: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
9930: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
9940: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
9950: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
9960: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
9970: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
9980: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
9990: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
99a0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
99b0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
99c0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
99d0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
99e0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
99f0: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
9a00: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
9a10: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
9a20: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
9a30: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
9a40: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
9a50: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9a80: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
9a90: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
9ab0: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
9ac0: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
9ad0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9af0: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
9b00: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
9b10: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
9b20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9b30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
9b50: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
9b60: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9b80: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
9b90: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
9ba0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
9bb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
9bc0: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
9bd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9be0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9bf0: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
9c00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
9c10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9c20: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
9c30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c40: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
9c50: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
9c60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
9c70: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
9c80: 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
9c90: 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
9ca0: 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
9cb0: 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
9cc0: 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
9cd0: 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
9ce0: 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
9cf0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
9d00: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9d10: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
9d20: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9d30: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
9d40: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
9d50: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
9d60: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
9d70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
9d80: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
9d90: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
9da0: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
9db0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
9dc0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
9dd0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
9de0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
9df0: 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
9e00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
9e10: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
9e20: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
9e30: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
9e40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
9e50: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
9e60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
9e70: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
9e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
9e90: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
9ea0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
9eb0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9ec0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
9ed0: 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
9ee0: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
9ef0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9f00: 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
9f10: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
9f20: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9f30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9f40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
9f50: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
9f60: 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
9f70: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9f80: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9f90: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9fa0: 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
9fb0: 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
9fc0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9fd0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9fe0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9ff0: 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
a000: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
a010: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a020: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
a030: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20  ournalMagic, 8, 
a040: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
a050: 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  r+8))).  ){.    
a060: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a070: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a080: 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b  Off += (nMaster+
a090: 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  20);.  pPager->n
a0a0: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
a0b0: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a  r->noSync;..  /*
a0c0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a0d0: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
a0e0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
a0f0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
a100: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
a110: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
a120: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a130: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
a140: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
a150: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
a160: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
a170: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
a180: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
a190: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
a1a0: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
a1b0: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
a1c0: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
a1d0: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
a1e0: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
a1f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
a200: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
a210: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
a220: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
a230: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
a240: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
a250: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
a260: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
a280: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
a290: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
a2a0: 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
a2b0: 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
a2c0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
a2d0: 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
a2e0: 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
a2f0: 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
a300: 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
a320: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
a330: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
a340: 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
a350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a360: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
a370: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
a380: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
a390: 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a  number. Return.*
a3a0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
a3b0: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
a3c0: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
a3d0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a   page is not .**
a3e0: 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f   already in memo
a3f0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  ry..*/.static Pg
a400: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
a410: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
a420: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
a430: 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
a460: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
a470: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
a480: 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68   a call to Pcach
a490: 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72  eFetch() with cr
a4a0: 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20  eateFlag==0 to. 
a4b0: 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20   ** fail, since 
a4c0: 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  no attempt to al
a4d0: 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d  locate dynamic m
a4e0: 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61  emory will be ma
a4f0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64  de..  */.  (void
a500: 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
a510: 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
a520: 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
a530: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
a540: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74  ../*.** Unless t
a550: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a560: 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63  rror-state, disc
a570: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
a580: 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74  y pages. If.** t
a590: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a5a0: 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e  rror-state, then
a5b0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
a5c0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  no-op..**.** TOD
a5d0: 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e 6f  O: Why can we no
a5e0: 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  t reset the page
a5f0: 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f 72  r while in error
a600: 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69   state?.*/.stati
a610: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
a620: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
a630: 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ){.  if( SQLITE_
a640: 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72 43  OK==pPager->errC
a650: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
a660: 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
a670: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
a680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
a690: 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
a6a0: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 70  >pPCache);.    p
a6b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
a6c0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
a6d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
a6e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
a6f0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
a700: 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
a710: 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
a720: 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
a730: 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
a740: 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
a750: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
a760: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
a770: 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
a780: 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
a790: 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
a7a0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
a7b0: 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
a7c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
a7d0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
a7e0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
a7f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
a800: 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
a810: 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
a820: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
a830: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
a840: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
a850: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
a860: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
a870: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
a880: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
a890: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
a8a0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
a8b0: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
a8c0: 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
a8d0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
a8e0: 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
a8f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a900: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a910: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
a920: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
a930: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a940: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
a950: 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
a960: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
a970: 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
a980: 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
a990: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
a9a0: 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
a9b0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
a9c0: 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
a9d0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
a9e0: 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
a9f0: 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
aa00: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
aa10: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
aa20: 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
aa30: 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
aa40: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
aa50: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
aa80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
aa90: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
aaa0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
aab0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
aac0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
aad0: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
aae0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aaf0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
ab00: 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
ab10: 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
ab20: 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
ab30: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
ab40: 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
ab50: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
ab60: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
ab70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
ab80: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
ab90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
aba0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
abc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
abd0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
abe0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
abf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
ac00: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
ac10: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
ac20: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
ac30: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
ac40: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
ac50: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
ac60: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
ac70: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
ac80: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
ac90: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
aca0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
acb0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
acc0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
acd0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
ace0: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
acf0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
ad00: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
ad10: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
ad20: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ad30: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
ad40: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
ad50: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
ad60: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
ad70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
ad80: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
ad90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
ada0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
adb0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
adc0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
add0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ade0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
adf0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
ae00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
ae10: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
ae20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
ae30: 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ck..    ** Other
ae40: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
ae50: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
ae60: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
ae70: 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64  e might.    ** d
ae80: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
ae90: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
aea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
aeb0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
aec0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71  er->jfd);.    sq
aed0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
aee0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
aef0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
af10: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41   0;.    releaseA
af20: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
af30: 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
af40: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
af50: 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20  ocked, somebody 
af60: 65 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67  else might chang
af70: 65 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a  e it. The.    **
af80: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
af90: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65  n Pager.dbSize e
afa0: 74 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  tc. might become
afb0: 20 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20   invalid if.    
afc0: 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  ** this happens.
afd0: 20 20 4f 6e 65 20 63 61 6e 20 61 72 67 75 65 20    One can argue 
afe0: 74 68 61 74 20 74 68 69 73 20 64 6f 65 73 6e 27  that this doesn'
aff0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
b000: 61 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69  ared.    ** unti
b010: 6c 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  l the change-cou
b020: 6e 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73  nter check fails
b030: 20 69 6e 20 50 61 67 65 72 53 68 61 72 65 64 4c   in PagerSharedL
b040: 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2a 20 43 6c  ock()..    ** Cl
b050: 65 61 72 69 6e 67 20 74 68 65 20 70 61 67 65 20  earing the page 
b060: 73 69 7a 65 20 63 61 63 68 65 20 68 65 72 65 20  size cache here 
b070: 69 73 20 62 65 69 6e 67 20 63 6f 6e 73 65 72 76  is being conserv
b080: 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
b090: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b0a0: 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20  Valid = 0;..    
b0b0: 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  rc = osUnlock(pP
b0c0: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
b0d0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  K);.    if( rc )
b0e0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
b0f0: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
b100: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b110: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
b120: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a  pPager))..    /*
b130: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
b140: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
b150: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
b160: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
b170: 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74   be.    ** trust
b180: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
b190: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
b1a0: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
b1b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
b1c0: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
b1d0: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
b1e0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
b1f0: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
b200: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
b210: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b220: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b230: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b240: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
b250: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
b260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
b270: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
b280: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
b290: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
b2a0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  tDone = 0;.    p
b2b0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
b2c0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
b2d0: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
b2e0: 69 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ied = 0;.  }.}..
b2f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b300: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ion should be ca
b310: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45  lled when an IOE
b320: 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46  RR, CORRUPT or F
b330: 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79  ULL error.** may
b340: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20   have occurred. 
b350: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
b360: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
b370: 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a  to the pager .**
b380: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
b390: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
b3a0: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
b3b0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
b3c0: 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75  pager .** API fu
b3d0: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75  nction. The valu
b3e0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
b3f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
b400: 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  nd argument .** 
b410: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
b420: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
b430: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
b440: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
b450: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
b460: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
b470: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
b480: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
b490: 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69   Until the persi
b4a0: 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c  sten error is cl
b4b0: 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71  eared,.** subseq
b4c0: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
b4d0: 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c  n this Pager wil
b4e0: 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
b4f0: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a  turn the same .*
b500: 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  * error code..**
b510: 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74  .** A persistent
b520: 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73   error indicates
b530: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
b540: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
b550: 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
b560: 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
b570: 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
b580: 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
b590: 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
b5a0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
b5b0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
b5c0: 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
b5d0: 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
b5e0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
b5f0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
b600: 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
b610: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
b620: 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
b630: 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
b640: 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
b650: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
b660: 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
b670: 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
b680: 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
b690: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
b6a0: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
b6b0: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
b6c0: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
b6d0: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
b6e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b6f0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
b700: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
b710: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
b720: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
b730: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b740: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
b750: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
b760: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
b770: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
b780: 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
b790: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
b7a0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
b7b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
b7c0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
b7d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b7e0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
b7f0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
b800: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
b810: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
b820: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
b830: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
b840: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
b850: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
b860: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
b870: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
b880: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
b890: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
b8a0: 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
b8b0: 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
b8c0: 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
b8e0: 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
b8f0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
b900: 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
b910: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
b920: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
b930: 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d  state. If this m
b940: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
b950: 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
b960: 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
b970: 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
b980: 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   next connection
b990: 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
b9a0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
b9b0: 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
b9c0: 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
b9d0: 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74   will.** roll it
b9e0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
b9f0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
ba00: 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
ba10: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
ba20: 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
ba30: 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
ba40: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
ba50: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
ba60: 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
ba70: 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
ba80: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
ba90: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68   error state. Wh
baa0: 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
bab0: 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
bac0: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
bad0: 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
bae0: 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
baf0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
bb00: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
bb10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bb20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
bb30: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
bb40: 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
bb50: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
bb60: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
bb70: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
bb80: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
bb90: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
bba0: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
bbb0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
bbc0: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
bbd0: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
bbe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
bbf0: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
bc00: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
bc10: 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
bc20: 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
bc30: 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
bc40: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
bc50: 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
bc60: 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
bc70: 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
bc80: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
bc90: 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
bca0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
bcb0: 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
bcc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bcd0: 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
bce0: 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
bcf0: 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
bd00: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
bd10: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
bd20: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bd30: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
bd40: 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  or PAGER_UNLOCK 
bd50: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
bd60: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
bd70: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
bd80: 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c  -op (returns SQL
bd90: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK)..**.** O
bda0: 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
bdb0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
bdc0: 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
bdd0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
bde0: 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
bdf0: 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
be00: 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
be10: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
be20: 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
be30: 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
be40: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
be50: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
be60: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
be70: 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
be80: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
be90: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
bea0: 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
beb0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
bec0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
bed0: 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
bee0: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
bef0: 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
bf00: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bf10: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
bf20: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
bf30: 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
bf40: 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
bf50: 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
bf60: 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
bf70: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bf80: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
bf90: 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
bfa0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
bfb0: 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
bfc0: 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
bfd0: 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
bfe0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
bff0: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
c000: 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
c010: 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
c020: 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
c030: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
c040: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
c050: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
c060: 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
c070: 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
c080: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
c090: 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
c0a0: 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
c0b0: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
c0c0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c0d0: 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
c0e0: 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
c0f0: 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
c100: 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
c110: 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
c120: 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
c130: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
c140: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
c150: 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
c160: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
c170: 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
c180: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
c190: 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
c1a0: 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
c1b0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
c1c0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c1d0: 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
c1e0: 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
c1f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c200: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
c210: 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
c220: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
c230: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
c240: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
c250: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
c260: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
c270: 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
c280: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
c290: 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
c2a0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
c2b0: 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
c2c0: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69   is finalized, i
c2d0: 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
c2e0: 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  -exclusive mode,
c2f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f   the.** pager mo
c300: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ves to PAGER_SHA
c310: 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64  RED state (and d
c320: 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f  owngrades the lo
c330: 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ck on the.** dat
c340: 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
c350: 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49  dingly)..**.** I
c360: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
c370: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
c380: 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20  ive mode and is 
c390: 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  in PAGER_SYNCED 
c3a0: 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76  state,.** it mov
c3b0: 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  es to PAGER_EXCL
c3c0: 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20  USIVE. No locks 
c3d0: 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77  are downgraded w
c3e0: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a  hen running in.*
c3f0: 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  * exclusive mode
c400: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
c410: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
c420: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
c430: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
c440: 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
c450: 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
c460: 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
c470: 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
c480: 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
c490: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
c4a0: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
c4b0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c4c0: 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
c4d0: 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
c4e0: 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
c4f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c500: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
c510: 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
c520: 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
c530: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c540: 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
c550: 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
c560: 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
c570: 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
c580: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
c590: 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
c5a0: 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
c5b0: 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
c5c0: 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
c5d0: 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
c5e0: 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
c5f0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
c600: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
c610: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
c620: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
c630: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
c640: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c650: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
c660: 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
c670: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
c680: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
c690: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
c6a0: 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
c6b0: 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
c6c0: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
c6d0: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
c6e0: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
c6f0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c710: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
c720: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
c730: 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ger);..  assert(
c740: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c750: 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
c760: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
c770: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
c780: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20  ager->jfd) ){.. 
c790: 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
c7a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c7b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
c7c0: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
c7d0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
c7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c7f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c800: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c810: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
c820: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
c830: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
c840: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c850: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
c860: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
c870: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
c880: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
c890: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
c8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
c8b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c8d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c8e0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
c8f0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
c900: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
c910: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
c920: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c930: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
c940: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
c950: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
c960: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
c970: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
c980: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
c990: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
c9a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
c9b0: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
c9c0: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
c9d0: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
c9e0: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
c9f0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
ca00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
ca10: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
ca20: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
ca30: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ca40: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
ca50: 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
ca60: 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
ca70: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
ca80: 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
ca90: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
caa0: 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
cab0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
cac0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
cad0: 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
cae0: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
caf0: 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
cb00: 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
cb10: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
cb20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cb30: 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
cb40: 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
cb50: 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20   journal.  */.  
cb60: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
cb80: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
cb90: 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
cba0: 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
cbb0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cbc0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cbd0: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 29 3b  MEMORY .      );
cbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
cbf0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
cc00: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
cc10: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
cc20: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
cc30: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
cc40: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
cc50: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
cc60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
cc70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
cc80: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
cc90: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
cca0: 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
ccb0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
ccc0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
ccd0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
cce0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
ccf0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
cd00: 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
cd10: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
cd20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
cd30: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
cd40: 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
cd50: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
cd60: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
cd70: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
cd80: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
cd90: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
cda0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
cdb0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
cdc0: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
cdd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
cde0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
cdf0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
ce00: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
ce10: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
ce20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
ce30: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
ce40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
ce50: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
ce60: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
ce70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
ce80: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
ce90: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
cea0: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
ceb0: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
cec0: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
ced0: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
cee0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
cef0: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
cf00: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
cf10: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
cf20: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
cf30: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
cf40: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
cf50: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
cf60: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
cf70: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
cf80: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
cf90: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
cfa0: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
cfb0: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
cfc0: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
cfd0: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
cfe0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
cff0: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
d000: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
d010: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
d020: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
d030: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
d040: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
d050: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d060: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
d070: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
d080: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
d090: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
d0a0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
d0b0: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
d0c0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
d0d0: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
d0e0: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
d0f0: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
d100: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
d110: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
d120: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
d130: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
d140: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
d150: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
d160: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
d170: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
d180: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
d190: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
d1a0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
d1b0: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
d1c0: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
d1d0: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
d1e0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
d1f0: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
d200: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
d210: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
d220: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
d230: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
d240: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
d250: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
d260: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
d270: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
d280: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
d290: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
d2a0: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
d2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
d2c0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
d2d0: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
d2e0: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
d2f0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
d300: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
d310: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
d320: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
d330: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
d340: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
d350: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
d360: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
d370: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
d380: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
d390: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
d3a0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
d3b0: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
d3c0: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
d3d0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
d3e0: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
d3f0: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
d400: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
d410: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
d420: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
d430: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
d440: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
d450: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
d460: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
d470: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
d480: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
d490: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
d4a0: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
d4b0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
d4c0: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
d4d0: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
d4e0: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
d4f0: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
d500: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
d510: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
d520: 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
d530: 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
d540: 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
d550: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
d560: 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
d570: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
d580: 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61  e isMainJrnl fla
d590: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69  g is true if thi
d5a0: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f  s is the main ro
d5b0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
d5c0: 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  nd.** false for 
d5d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d5e0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e  urnal.  The main
d5f0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d600: 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73  l uses.** checks
d610: 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
d620: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
d630: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
d640: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
d650: 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
d660: 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
d670: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
d680: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
d690: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
d6a0: 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
d6b0: 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
d6c0: 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
d6d0: 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
d6e0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
d6f0: 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
d700: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
d710: 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
d720: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
d730: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
d740: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
d750: 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
d760: 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
d770: 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
d780: 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
d790: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
d7a0: 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
d7b0: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
d7c0: 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
d7d0: 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
d7e0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
d7f0: 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
d800: 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
d810: 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
d820: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
d830: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
d840: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
d850: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
d860: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
d870: 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
d880: 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
d890: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
d8a0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d8b0: 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
d8c0: 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
d8d0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
d8e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
d8f0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
d900: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d910: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
d920: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
d930: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
d940: 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
d950: 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
d960: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
d970: 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
d980: 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
d990: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
d9a0: 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
d9b0: 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
d9c0: 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
d9d0: 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
d9e0: 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
d9f0: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
da00: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
da10: 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
da20: 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
da30: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
da40: 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
da50: 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
da60: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
da70: 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
da80: 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
da90: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
daa0: 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
dab0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
dac0: 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
dad0: 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
dae0: 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
daf0: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
db00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
db10: 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
db20: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
db30: 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
db40: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
db50: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
db60: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
db70: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
db80: 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
db90: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
dba0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
dbb0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
dbc0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
dbd0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
dbe0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
dbf0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
dc00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
dc10: 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
dc20: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
dc30: 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
dc40: 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
dc50: 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
dc60: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
dc70: 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20 20   int isUnsync,  
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc90: 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
dca0: 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64 20  g from unsynced 
dcb0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
dcc0: 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
dcf0: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
dd00: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
dd10: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
dd20: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
dd30: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dd40: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
dd50: 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  *pDone          
dd60: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
dd70: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
dd80: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
dd90: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
dda0: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddc0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
ddd0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
dde0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
de10: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
de20: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
de30: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de50: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
de60: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
de70: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
de80: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
de90: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
dea0: 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
deb0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
dec0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
ded0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dee0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
def0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
df00: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
df10: 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
df20: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
df30: 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
df40: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
df50: 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
df60: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
df70: 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
df80: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
df90: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
dfa0: 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
dfb0: 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
dfc0: 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
dfd0: 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
dfe0: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
dff0: 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
e000: 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
e010: 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
e020: 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
e030: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e040: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
e050: 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
e060: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
e070: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
e080: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
e090: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
e0a0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
e0b0: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
e0c0: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
e0d0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
e0e0: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
e0f0: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
e100: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
e110: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
e120: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
e130: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
e140: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
e150: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
e160: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
e170: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
e180: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e190: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e1a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
e1b0: 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
e1c0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e1d0: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
e1e0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
e1f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e200: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
e210: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
e220: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
e230: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
e240: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
e250: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
e260: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
e270: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
e280: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
e290: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
e2a0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
e2b0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
e2c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
e2d0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
e2e0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
e2f0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
e300: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
e310: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
e320: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
e330: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
e340: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
e350: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
e360: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
e370: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
e380: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
e390: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
e3a0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
e3b0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
e3c0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
e3d0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
e3e0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
e3f0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
e400: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
e410: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e420: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e430: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
e440: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
e450: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
e460: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
e470: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
e480: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
e490: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
e4a0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
e4b0: 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
e4c0: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
e4d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
e4e0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
e4f0: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
e500: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
e510: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
e520: 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  o))!=SQLITE_OK )
e530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e540: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
e550: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
e560: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
e570: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
e580: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
e590: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e5a0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
e5b0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
e5c0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
e5d0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
e5e0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
e5f0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
e600: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
e610: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
e620: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
e630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e640: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
e650: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
e660: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
e670: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
e680: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
e690: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
e6a0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
e6b0: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
e6c0: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
e6d0: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
e6e0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
e6f0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
e700: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
e710: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
e720: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
e730: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
e740: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
e750: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
e760: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
e770: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
e780: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
e790: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
e7a0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
e7b0: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
e7c0: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
e7d0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
e7e0: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
e7f0: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
e800: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
e810: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
e820: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
e830: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
e840: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
e850: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
e860: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
e870: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
e880: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
e890: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
e8a0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
e8b0: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
e8c0: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
e8d0: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
e8e0: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
e8f0: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
e900: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
e910: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
e920: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
e930: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
e940: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
e950: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
e960: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
e970: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
e980: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
e990: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
e9a0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
e9b0: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
e9c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
e9d0: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
e9e0: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
e9f0: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
ea00: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
ea10: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
ea20: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
ea30: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
ea40: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
ea50: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
ea60: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
ea70: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
ea80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
ea90: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
eaa0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
eab0: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
eac0: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
ead0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
eae0: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
eaf0: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
eb00: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
eb10: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
eb20: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
eb30: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
eb40: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
eb50: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
eb60: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
eb70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
eb80: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
eb90: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
eba0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
ebb0: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
ebc0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
ebd0: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
ebe0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
ebf0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
ec00: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
ec10: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
ec20: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
ec30: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
ec40: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
ec50: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
ec60: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
ec70: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
ec80: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
ec90: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
eca0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
ecb0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
ecc0: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
ecd0: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
ece0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
ecf0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ed00: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ed10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
ed20: 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41  | !MEMDB );.  PA
ed30: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
ed40: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
ed50: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
ed60: 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
ed70: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ed80: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ed90: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
eda0: 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
edc0: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
edd0: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
ede0: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
edf0: 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
ee00: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
ee10: 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30  E).   && (pPg==0
ee20: 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
ee30: 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
ee40: 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65  NC)).   && isOpe
ee50: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
ee60: 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20   && !isUnsync.  
ee70: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
ee80: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
ee90: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
eea0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
eeb0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
eec0: 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  ->fd, (u8*)aData
eed0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
eee0: 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
eef0: 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
ef00: 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
ef10: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
ef20: 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
ef30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
ef40: 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
ef50: 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
ef60: 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
ef70: 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
ef80: 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
ef90: 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
efa0: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
efb0: 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
efc0: 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
efd0: 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
efe0: 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
eff0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
f000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
f010: 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
f020: 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
f030: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
f040: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
f050: 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
f060: 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
f070: 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
f080: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
f090: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
f0a0: 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
f0b0: 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
f0c0: 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
f0d0: 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
f0e0: 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
f0f0: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
f100: 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
f110: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f120: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
f130: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
f140: 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
f150: 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
f160: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
f170: 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
f180: 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
f190: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
f1a0: 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
f1b0: 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
f1c0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
f1d0: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
f1e0: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
f1f0: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
f200: 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
f210: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
f220: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f230: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
f240: 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
f250: 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
f260: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
f270: 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
f280: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
f290: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
f2a0: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
f2b0: 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
f2c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
f2d0: 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
f2e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
f2f0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
f300: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
f310: 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
f320: 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
f330: 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
f340: 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
f350: 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
f360: 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
f370: 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
f380: 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
f390: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f3a0: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
f3b0: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  ;.    if( (rc = 
f3c0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
f3d0: 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
f3e0: 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c  , &pPg, 1))!=SQL
f3f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f400: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f410: 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
f420: 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
f430: 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
f440: 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
f450: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
f460: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
f470: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
f480: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
f490: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
f4a0: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
f4b0: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
f4c0: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
f4d0: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
f4e0: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
f4f0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
f500: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
f510: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
f520: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
f530: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
f540: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
f550: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
f560: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
f570: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
f580: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
f590: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
f5a0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
f5b0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
f5c0: 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
f5d0: 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
f5e0: 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
f5f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f600: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
f610: 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
f620: 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
f630: 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
f640: 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
f650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f660: 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
f670: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
f680: 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
f690: 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
f6a0: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
f6b0: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
f6c0: 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
f6d0: 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
f6e0: 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
f6f0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
f700: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
f710: 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
f720: 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
f730: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
f740: 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
f750: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
f760: 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
f770: 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
f780: 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  the..      **.  
f790: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
f7a0: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
f7b0: 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
f7c0: 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
f7d0: 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
f7e0: 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
f7f0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
f800: 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
f810: 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
f820: 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
f830: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
f840: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
f850: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
f860: 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
f870: 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
f880: 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
f890: 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
f8a0: 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
f8b0: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
f8c0: 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
f8d0: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f8e0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
f8f0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
f900: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
f910: 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
f920: 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
f930: 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
f940: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
f950: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
f960: 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
f970: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
f980: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
f990: 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
f9a0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
f9b0: 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
f9c0: 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
f9d0: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
f9e0: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
f9f0: 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
fa00: 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
fa10: 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
fa20: 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
fa30: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
fa40: 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
fa50: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
fa60: 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
fa70: 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
fa80: 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
fa90: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
faa0: 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
fab0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
fac0: 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
fad0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
fae0: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
faf0: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
fb00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
fb10: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
fb20: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
fb30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
fb40: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
fb50: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
fb60: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
fb70: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
fb80: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
fb90: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
fba0: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
fbb0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
fbc0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
fbd0: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
fbe0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
fbf0: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
fc00: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
fc10: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
fc20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
fc30: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
fc40: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
fc50: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
fc60: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
fc70: 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
fc80: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
fc90: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
fca0: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
fcb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fcc0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
fcd0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
fce0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
fcf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
fd00: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
fd10: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
fd20: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
fd30: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
fd40: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
fd50: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
fd60: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
fd70: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
fd80: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
fd90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fda0: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
fdb0: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
fdc0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
fdd0: 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
fde0: 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
fdf0: 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
fe00: 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
fe10: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
fe20: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
fe30: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
fe40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
fe50: 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
fe60: 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
fe70: 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
fe80: 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
fe90: 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
fea0: 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
feb0: 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
fec0: 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
fed0: 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
fee0: 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
fef0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
ff00: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
ff10: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
ff20: 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
ff30: 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
ff40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
ff50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ff60: 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
ff70: 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
ff80: 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
ff90: 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
ffa0: 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
ffb0: 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
ffc0: 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
ffd0: 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
ffe0: 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
fff0: 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
10000 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
10010 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
10020 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
10030 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
10040 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
10050 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
10060 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10070 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10080 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
10090 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
100a0 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
100b0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
100c0 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
100d0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
100e0 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
100f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
10100 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
10110 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
10120 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
10130 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
10140 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
10150 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
10160 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
10170 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
10180 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
10190 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
101a0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
101b0 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
101c0 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
101d0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
101e0 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
101f0 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
10200 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
10210 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
10220 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
10230 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
10240 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
10250 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
10260 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
10270 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
10280 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
10290 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
102a0 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
102b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
102c0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
102d0 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
102e0 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
102f0 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
10300 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
10310 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
10320 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
10330 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
10340 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
10350 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
10360 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
10370 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
10380 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
10390 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
103a0 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
103b0 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
103c0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
103d0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
103e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
103f0 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
10400 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
10410 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
10420 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
10430 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
10440 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
10450 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
10460 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
10470 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10480 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10490 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
104a0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
104b0 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
104e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
104f0 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
10500 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
10510 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10520 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
10530 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
10540 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
10550 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
10560 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10570 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
10580 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
10590 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
105a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
105b0 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
105c0 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
105d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
105e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
105f0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
10600 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
10610 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
10620 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
10630 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
10640 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
10650 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
10660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10670 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
10680 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
10690 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
106a0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
106b0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
106c0 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
106d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
106e0 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
106f0 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
10700 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
10710 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
10720 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
10730 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
10740 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
10750 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
10760 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
10770 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
10780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10790 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
107a0 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
107b0 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
107c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
107d0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
107e0 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71  _out;..  rc = sq
107f0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10800 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
10810 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
10820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10830 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10840 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
10850 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
10860 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
10870 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
10880 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20  asterPtr = 0;.  
10890 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
108a0 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
108b0 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
108c0 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
108d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108e0 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
108f0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
10900 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
10910 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
10920 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
10930 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
10940 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
10950 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
10960 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
10970 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
10980 72 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  r + 1);.    if( 
10990 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
109a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
109b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
109c0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
109d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
109e0 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
109f0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
10a00 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
10a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10a20 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
10a30 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
10a40 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
10a50 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
10a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10a70 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10a80 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  out;.    zMaster
10a90 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
10aa0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
10ab0 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
10ac0 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
10ad0 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
10ae0 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
10af0 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
10b00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
10b10 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
10b20 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
10b30 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
10b40 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
10b50 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
10b60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10b80 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
10b90 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
10ba0 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
10bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
10bc0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
10bd0 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
10be0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10bf0 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
10c00 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
10c10 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
10c20 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
10c30 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
10c40 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
10c50 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
10c60 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
10c70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
10c80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10c90 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
10ca0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
10cb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10cc0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10cd0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
10ce0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10cf0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
10d00 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
10d10 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
10d20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d40 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
10d50 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
10d60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
10d70 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
10d80 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
10d90 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
10da0 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
10db0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
10dc0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
10dd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10df0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
10e00 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
10e10 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
10e20 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
10e30 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
10e40 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
10e50 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
10e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
10e70 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
10e80 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
10e90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10ea0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
10eb0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
10ec0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
10ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
10ee0 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
10ef0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
10f00 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
10f10 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
10f20 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
10f30 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
10f40 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
10f50 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
10f60 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
10f70 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
10f80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
10f90 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
10fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
10fb0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
10fc0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
10fd0 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
10fe0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
10ff0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
11000 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
11010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11020 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
11030 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
11040 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11050 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
11060 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
11070 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
11080 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
11090 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
110a0 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
110b0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
110c0 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
110d0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
110e0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
110f0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
11100 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
11110 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63   open, or an exc
11120 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e  lusive lock is n
11130 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73  ot.** held, this
11140 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11150 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
11160 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
11170 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e   file is.** chan
11180 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
11190 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
111a0 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
111b0 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a  ). If the file.*
111c0 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  * on disk is cur
111d0 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
111e0 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
111f0 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
11200 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
11210 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
11220 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
11230 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   it might might 
11240 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
11250 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
11260 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
11270 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
11280 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
11290 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
112a0 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
112b0 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
112c0 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
112d0 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
112e0 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
112f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
11300 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
11310 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
11320 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
11330 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
11340 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
11350 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
11360 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
11370 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11390 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
113a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
113b0 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
113c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
113d0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
113e0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
113f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
11400 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
11410 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
11420 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
11430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11440 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11450 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
11460 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e  LUSIVE && isOpen
11470 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
11480 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
11490 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
114a0 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
114b0 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
114c0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
114d0 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
114e0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
114f0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
11500 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
11510 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
11520 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
11530 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
11540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11550 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
11560 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
11570 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
11580 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
115a0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
115b0 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
115c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
115d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
115e0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
115f0 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
11600 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
11610 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11630 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
11640 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11650 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11670 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
11680 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
11690 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
116a0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
116b0 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
116c0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
116d0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
116e0 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
116f0 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
11700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11710 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
11720 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
11730 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
11740 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
11750 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
11760 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
11770 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
11780 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
11790 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
117a0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
117b0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
117c0 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
117d0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
117e0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
117f0 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
11800 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
11810 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
11820 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
11830 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
11840 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
11850 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
11860 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
11870 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
11880 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
11890 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
118a0 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
118b0 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
118c0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
118d0 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
118e0 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ZE..*/.static vo
118f0 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
11900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11910 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
11920 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
11930 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
11940 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  e );..  if( !pPa
11950 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
11960 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
11970 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
11980 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
11990 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
119a0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
119b0 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
119c0 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
119d0 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
119e0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
119f0 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
11a00 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  gfault..    */. 
11a10 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
11a20 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
11a30 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
11a40 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69  er->fd);.  }.  i
11a50 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
11a60 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20  rSize<32 ){.    
11a70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
11a80 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
11a90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
11aa0 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
11ab0 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
11ac0 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
11ad0 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
11ae0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
11af0 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
11b00 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
11b10 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
11b20 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
11b30 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
11b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
11b50 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
11b60 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
11b70 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
11b80 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
11b90 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
11ba0 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
11bb0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
11bc0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
11bd0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
11be0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
11bf0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
11c00 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
11c10 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
11c20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
11c30 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
11c40 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
11c50 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
11c60 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
11c70 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
11c80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
11c90 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
11ca0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
11cb0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
11cc0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
11cd0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
11ce0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
11cf0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
11d00 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
11d10 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
11d20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
11d30 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
11d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11d50 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
11d60 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
11d70 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
11d80 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
11d90 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
11da0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
11db0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
11dc0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
11dd0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
11de0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
11df0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
11e00 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
11e10 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
11e20 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
11e30 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
11e40 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
11e50 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
11e60 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
11e70 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
11e80 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
11e90 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
11ea0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
11eb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
11ec0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
11ed0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
11ee0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
11ef0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
11f00 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
11f10 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
11f20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
11f30 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
11f40 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
11f50 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
11f60 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
11f70 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
11f80 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
11f90 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
11fa0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
11fb0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
11fc0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
11fd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
11fe0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
11ff0 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
12000 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
12010 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
12020 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
12030 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
12040 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
12050 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
12060 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
12070 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
12080 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
12090 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
120a0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
120b0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
120c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
120d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
120e0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
120f0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
12100 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
12110 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
12120 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
12130 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
12140 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
12150 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
12160 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
12170 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
12180 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
12190 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
121a0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
121b0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
121c0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
121d0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
121e0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
121f0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
12200 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
12210 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
12220 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
12230 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
12240 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
12250 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
12260 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
12270 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
12280 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
12290 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
122a0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
122b0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
122c0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
122d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
122e0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
122f0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
12300 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
12310 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
12320 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
12330 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
12340 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
12350 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
12360 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
12370 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
12380 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
12390 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
123a0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
123b0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
123c0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
123d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
123e0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
123f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
12400 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
12410 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
12420 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
12430 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
12440 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
12450 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
12460 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
12470 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
12480 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
12490 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
124a0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
124b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
124c0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
124d0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
124e0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
124f0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
12500 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
12510 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
12520 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
12530 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
12540 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
12550 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
12560 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
12570 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
12580 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
12590 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
125a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
125b0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
125c0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
125d0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
125e0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
125f0 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
12600 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
12610 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
12620 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
12630 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
12640 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
12650 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
12660 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
12670 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12680 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
12690 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
126b0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
126c0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
126d0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
12700 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
12710 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
12740 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
12750 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
12760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12770 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
12780 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
12790 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127b0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
127c0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
127d0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
127e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
127f0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
12800 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
12810 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
12820 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
12830 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
12840 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
12850 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
12860 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
12870 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
12880 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
12890 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
128a0 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46  lback */..  /* F
128b0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
128c0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
128d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
128e0 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
128f0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
12900 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
12910 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
12920 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
12930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12940 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
12950 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
12960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12970 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
12980 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
12990 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
129a0 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
129b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
129c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
129d0 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
129e0 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
129f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
12a00 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
12a10 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
12a20 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
12a30 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
12a40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
12a50 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
12a60 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
12a70 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
12a80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
12a90 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
12aa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
12ab0 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
12ac0 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
12ad0 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
12ae0 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
12af0 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
12b00 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
12b10 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
12b20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
12b30 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
12b40 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
12b50 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
12b60 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
12b70 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
12b80 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
12b90 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
12ba0 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
12bb0 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
12bc0 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
12bd0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
12be0 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
12bf0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
12c00 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
12c10 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
12c20 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
12c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12c40 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
12c50 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12c60 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
12c70 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
12c80 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
12c90 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
12ca0 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
12cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
12cc0 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
12cd0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
12ce0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
12cf0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
12d00 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
12d10 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
12d20 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
12d30 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
12d40 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
12d50 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
12d60 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
12d70 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
12d80 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
12d90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
12da0 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
12db0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
12dc0 20 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 20     int isUnsync 
12dd0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  = 0;..    /* Rea
12de0 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
12df0 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
12e00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
12e10 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
12e20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
12e30 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
12e40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12e50 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
12e60 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
12e70 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
12e80 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
12e90 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
12ea0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
12eb0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
12ec0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
12ed0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
12ee0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
12ef0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
12f00 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
12f10 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
12f20 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
12f30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12f40 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
12f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
12f60 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
12f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
12f90 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
12fa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12fb0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
12fc0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
12fd0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
12fe0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
12ff0 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
13000 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
13010 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13020 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
13030 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
13040 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
13050 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
13060 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
13070 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
13080 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
13090 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
130a0 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
130b0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
130c0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
130d0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
130e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
130f0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
13100 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13110 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
13120 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
13130 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13140 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
13150 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
13170 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
13180 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
13190 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
131a0 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
131b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
131c0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
131d0 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
131e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
131f0 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
13200 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
13210 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13220 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
13230 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
13240 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
13250 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
13260 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
13270 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
13280 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
13290 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
132a0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
132b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
132c0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
132d0 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
132e0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
132f0 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
13300 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
13310 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
13320 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
13330 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
13340 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
13350 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
13360 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
13370 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13380 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
13390 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
133a0 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
133b0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
133c0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
133d0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
133e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
133f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13400 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
13410 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
13420 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
13430 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
13440 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
13450 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
13460 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
13470 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
13480 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13490 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
134a0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
134b0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
134c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
134d0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
134e0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
134f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13500 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
13510 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
13520 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
13530 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
13540 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
13550 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20   isUnsync = 1;. 
13560 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13570 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
13580 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
13590 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
135a0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
135b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
135c0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
135d0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
135e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
135f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13600 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13610 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
13620 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
13630 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
13640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13660 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
13670 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
13680 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
13690 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
136a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
136b0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
136c0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
136d0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
136e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
136f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
13700 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
13710 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
13720 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
13730 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
13740 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
13750 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
13760 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
13770 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
13780 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13790 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
137a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
137b0 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e  pPager,1,isUnsyn
137c0 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  c,&pPager->journ
137d0 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20  alOff,0,0);.    
137e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
137f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
13800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
13810 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
13820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13830 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13840 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
13850 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
13860 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
13870 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
13880 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
13890 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71  e to rollback, q
138a0 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  uit and return t
138b0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
138c0 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69     ** code.  Thi
138d0 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
138e0 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
138f0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a  the error state.
13900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
13910 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20  that no further 
13920 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e  harm will be don
13930 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20  e.  Perhaps the 
13940 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a  next.          *
13950 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  * process to com
13960 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20  e along will be 
13970 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
13980 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
13990 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
139a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
139b0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
139c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
139d0 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
139e0 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
139f0 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
13a00 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69  ck:.  /* Followi
13a10 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
13a20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a30 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20   should be back 
13a40 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  in its original.
13a50 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72    ** state prior
13a60 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
13a70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13a80 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a  , so invoke the.
13a90 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54    ** SQLITE_FCNT
13aa0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66  L_DB_UNCHANGED f
13ab0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile-control meth
13ac0 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  od to disable th
13ad0 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e  e.  ** assertion
13ae0 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
13af0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
13b00 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  s modified..  */
13b10 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70  .  assert(.    p
13b20 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
13b30 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71  ods==0 ||.    sq
13b40 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
13b50 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  ol(pPager->fd,SQ
13b60 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
13b70 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49  CHANGED,0)>=SQLI
13b80 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a  TE_OK.  );..  /*
13b90 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
13ba0 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
13bb0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
13bc0 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
13bd0 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
13be0 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
13bf0 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
13c00 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
13c10 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
13c20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
13c30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13c40 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
13c50 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
13c60 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
13c70 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
13c80 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
13c90 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
13ca0 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
13cb0 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
13cc0 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
13cd0 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
13ce0 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
13cf0 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
13d00 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
13d10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
13d20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
13d30 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
13d40 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
13d50 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
13d60 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
13d70 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
13d80 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
13d90 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
13da0 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
13db0 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
13dc0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
13dd0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
13de0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
13df0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
13e00 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
13e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13e20 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
13e30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
13e40 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
13e50 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
13e60 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
13e70 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
13e80 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
13e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
13ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
13eb0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
13ec0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
13ed0 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70  ->noSync==0 && p
13ee0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
13ef0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
13f00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13f10 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
13f20 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
13f30 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69  _flags);.  }.  i
13f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13f50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
13f60 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
13f70 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
13f80 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20  er[0]!='\0');.  
13f90 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
13fb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13fc0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
13fd0 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
13fe0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
13ff0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
14000 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
14010 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
14020 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
14030 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
14040 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
14050 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
14060 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
14070 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
14080 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
14090 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
140a0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
140b0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
140c0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
140d0 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
140e0 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
140f0 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
14100 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
14110 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
14120 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
14130 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
14140 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
14150 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
14160 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
14170 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
14180 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
14190 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
141a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
141b0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
141c0 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
141d0 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
141e0 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
141f0 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
14200 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
14210 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
14220 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
14230 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
14240 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
14250 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
14260 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
14270 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
14280 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
14290 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
142a0 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
142b0 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
142c0 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
142d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
142e0 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
142f0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
14300 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
14310 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
14320 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
14330 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
14340 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
14350 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
14360 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
14370 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14380 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
14390 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
143a0 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
143b0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
143c0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
143d0 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
143e0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
143f0 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
14400 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
14410 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
14420 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
14430 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14440 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
14450 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
14460 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14470 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
14480 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
14490 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
144a0 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
144b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
144c0 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
144d0 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
144e0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
144f0 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
14500 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
14510 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
14520 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
14530 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
14540 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
14550 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
14560 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
14570 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
14580 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
14590 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
145a0 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
145b0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
145c0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
145d0 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
145e0 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
145f0 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
14600 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
14610 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
14620 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
14630 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
14640 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
14650 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
14660 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
14670 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
14680 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
14690 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
146a0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
146b0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
146c0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
146d0 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
146e0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
146f0 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
14700 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
14710 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
14720 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
14730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
14740 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
14750 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
14760 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
14770 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
14780 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
14790 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
147a0 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
147b0 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
147c0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
147d0 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
147e0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
147f0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
14800 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
14810 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
14820 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
14830 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
14840 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
14850 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
14860 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
14870 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
14880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14890 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
148a0 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
148b0 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
148c0 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
148d0 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148f0 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
14900 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14910 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
14920 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
14930 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
14940 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
14950 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
14960 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
14970 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
14980 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14990 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
149a0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
149b0 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
149c0 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
149d0 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
149e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
149f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
14a00 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  HARED );..  /* A
14a10 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
14a20 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
14a30 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
14a40 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
14a50 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
14a60 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
14a70 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
14a80 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
14a90 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
14aa0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
14ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14ac0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
14ad0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
14ae0 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
14af0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
14b00 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
14b10 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
14b20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
14b30 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
14b40 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14b50 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
14b60 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
14b70 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
14b80 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73  igSize;..  /* Us
14b90 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
14ba0 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
14bb0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
14bc0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
14bd0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
14be0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
14bf0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
14c00 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
14c10 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
14c20 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
14c30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14c40 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
14c50 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
14c60 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
14c70 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
14c80 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
14c90 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
14ca0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
14cb0 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
14cc0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
14cd0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
14ce0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
14cf0 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
14d00 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
14d10 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
14d20 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
14d30 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
14d40 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
14d50 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
14d60 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
14d70 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
14d80 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
14d90 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
14da0 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
14db0 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
14dc0 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
14dd0 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
14de0 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
14df0 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
14e00 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
14e10 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
14e20 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
14e30 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
14e40 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
14e50 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
14e60 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
14e70 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
14e80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
14e90 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
14ea0 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
14eb0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
14ec0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14ed0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
14ee0 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
14ef0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
14f00 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
14f10 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65  er, 1, 0, &pPage
14f20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
14f30 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a  , pDone);.    }.
14f40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
14f50 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
14f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
14f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14f80 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
14f90 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
14fa0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
14fb0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14fc0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
14fd0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
14fe0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
14ff0 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
15000 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
15010 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
15020 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
15030 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
15040 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
15050 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
15060 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
15070 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
15080 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
15090 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
150a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
150b0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
150c0 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
150d0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
150e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
150f0 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
15100 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
15110 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
15120 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
15130 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
15140 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
15150 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
15160 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
15170 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
15180 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15190 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
151a0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
151b0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
151c0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
151d0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
151e0 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
151f0 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
15200 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
15210 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
15220 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
15230 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15240 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
15250 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15260 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
15270 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
15280 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
15290 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
152a0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
152b0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
152c0 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
152d0 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
152e0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
152f0 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
15300 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15310 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
15320 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
15330 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
15340 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
15350 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
15360 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
15370 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
15380 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
15390 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  , 0, &pPager->jo
153a0 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f  urnalOff, 1, pDo
153b0 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
153c0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
153d0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
153e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
153f0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
15400 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
15410 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
15420 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
15430 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
15440 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
15450 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
15460 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
15470 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
15480 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
15490 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
154a0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
154b0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
154c0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
154d0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
154e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
154f0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
15500 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
15510 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15520 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
15530 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
15540 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
15550 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15560 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
15570 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
15580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15590 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
155a0 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
155b0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
155c0 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
155d0 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
155e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
155f0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15600 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f  pPager, 0, 0, &o
15610 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
15620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15630 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15640 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
15650 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
15660 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
15670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15680 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
15690 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
156a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
156b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
156c0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
156d0 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
156e0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
156f0 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
15700 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15710 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
15720 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
15730 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
15740 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
15750 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
15760 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
15770 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
15780 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
15790 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
157a0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
157b0 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
157c0 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
157d0 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
157e0 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
157f0 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
15800 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
15810 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
15820 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
15830 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
15840 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
15850 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
15860 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
15870 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
15880 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
15890 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
158a0 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
158b0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
158c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
158d0 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
158e0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
158f0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
15900 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
15910 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
15920 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
15930 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
15940 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
15950 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
15960 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
15970 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
15980 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
15990 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
159a0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
159b0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
159c0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
159d0 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
159e0 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
159f0 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
15a00 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
15a10 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
15a20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
15a30 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
15a40 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
15a50 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
15a60 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
15a70 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
15a80 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
15a90 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
15aa0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15ab0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
15ac0 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
15ad0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
15ae0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
15af0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
15b00 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
15b10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15b20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
15b30 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
15b40 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
15b50 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
15b60 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
15b70 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
15b80 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
15b90 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
15ba0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
15bb0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
15bc0 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
15bd0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
15be0 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
15bf0 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
15c00 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
15c10 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
15c20 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
15c30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15c40 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
15c50 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
15c60 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
15c70 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
15c80 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
15c90 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
15ca0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
15cb0 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
15cc0 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
15cd0 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
15ce0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
15cf0 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
15d00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
15d10 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
15d20 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
15d30 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
15d40 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
15d50 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
15d60 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
15d70 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
15d80 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
15d90 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
15da0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
15db0 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
15dc0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
15dd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
15de0 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
15df0 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
15e00 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
15e10 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
15e20 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
15e30 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
15e40 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
15e50 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
15e60 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
15e70 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
15e80 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
15e90 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
15ea0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
15eb0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
15ec0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
15ed0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
15ee0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
15ef0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
15f00 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
15f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15f20 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
15f30 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
15f40 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
15f50 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
15f60 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
15f70 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
15f80 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
15f90 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
15fa0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
15fb0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
15fc0 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
15fd0 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
15fe0 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
15ff0 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
16000 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
16010 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16030 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
16040 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
16050 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16060 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
16070 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16080 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
16090 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
160a0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
160b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
160c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
160d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
160e0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
160f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
16100 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
16110 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
16120 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
16130 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
16140 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
16150 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
16160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16170 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16180 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16190 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
161a0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
161b0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
161c0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
161d0 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
161e0 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
161f0 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
16200 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16210 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
16220 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16230 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
16240 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16250 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
16260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
16270 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
16280 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
16290 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
162a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
162b0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
162c0 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
162d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
162e0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
162f0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
16300 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
16310 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
16320 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
16330 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
16340 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
16350 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
16360 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
16370 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
16380 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
16390 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
163a0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
163b0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
163c0 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
163d0 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
163e0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
163f0 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
16400 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
16410 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
16420 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
16430 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
16440 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
16450 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
16460 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
16470 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
16480 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
16490 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
164b0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
164c0 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
164d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16500 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
16510 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
16520 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
16530 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
16540 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
16550 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
16560 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
16570 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
16580 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
16590 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
165a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
165b0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
165c0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
165d0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
165e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
165f0 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
16600 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
16610 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
16620 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
16630 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
16640 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
16650 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
16660 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
16670 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
16680 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
16690 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
166c0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
166d0 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
166e0 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
166f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
16700 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
16710 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
16720 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16740 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
16750 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
16760 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
16770 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
16780 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
16790 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
167a0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
167b0 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
167c0 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
167d0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
167e0 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
167f0 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
16800 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
16810 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
16820 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16830 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
16840 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
16850 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
16860 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
16870 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
16880 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
16890 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
168a0 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
168b0 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
168e0 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
168f0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
16900 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
16910 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
16920 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
16930 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
16940 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
16950 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
16960 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
16970 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
16980 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
16990 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
169a0 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
169b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
169c0 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
169d0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
169e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
169f0 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
16a00 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
16a10 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
16a20 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
16a30 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
16a40 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
16a50 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
16a60 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45  ORRUPT or SQLITE
16a70 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
16a80 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
16a90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16aa0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
16ab0 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
16ac0 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
16ad0 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
16ae0 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
16af0 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
16b00 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
16b10 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
16b20 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
16b30 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
16b40 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
16b50 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
16b60 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
16b70 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
16b80 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
16b90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
16ba0 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
16bb0 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
16bc0 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
16bd0 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
16be0 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
16bf0 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
16c00 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
16c10 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
16c20 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
16c30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16c40 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
16c50 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
16c60 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
16c70 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
16c80 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
16c90 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
16ca0 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
16cb0 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
16cc0 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
16cd0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
16ce0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
16cf0 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
16d00 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
16d10 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
16d20 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
16d30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
16d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
16d50 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
16d60 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
16d70 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
16d80 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
16d90 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
16da0 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
16db0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
16dc0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
16dd0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
16de0 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
16df0 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
16e00 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
16e10 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
16e20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
16e30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
16e40 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
16e50 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
16e60 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
16e70 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
16e80 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
16e90 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65  ager, u16 *pPage
16ea0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
16eb0 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
16ec0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
16ed0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
16ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36  TE_OK ){.    u16
16ef0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
16f00 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
16f10 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
16f20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
16f30 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
16f40 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
16f50 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20  IZE) );.    if( 
16f60 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
16f70 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
16f80 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20  ize==0).     && 
16f90 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
16fa0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
16fb0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 20  Cache)==0 .     
16fc0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
16fd0 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
16fe0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 29  >pageSize .    )
16ff0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
17000 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
17010 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
17020 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17030 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
17040 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17050 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
17060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67  lse{.        pag
17070 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17080 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
17090 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
170a0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73  eSize;.        s
170b0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
170c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
170d0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
170e0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
170f0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  New;.        sql
17100 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
17110 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
17120 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
17130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17140 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d      *pPageSize =
17150 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61   (u16)pPager->pa
17160 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  geSize;.    if( 
17170 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
17180 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
17190 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
171a0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
171b0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
171c0 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
171d0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
171e0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
171f0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17200 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
17210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17220 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
17230 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
17240 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
17250 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
17260 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
17270 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
17280 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
17290 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
172a0 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
172b0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
172c0 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
172d0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
172e0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
172f0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
17300 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
17310 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
17320 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
17330 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
17340 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
17350 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
17360 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
17370 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
17380 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
17390 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
173a0 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
173b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
173c0 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
173d0 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
173e0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
173f0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
17400 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
17410 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
17420 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
17430 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
17440 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
17450 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
17460 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
17470 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
17480 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
17490 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
174a0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
174b0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
174c0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
174d0 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
174e0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
174f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
17500 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
17510 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
17520 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
17530 6e 50 61 67 65 3b 0a 20 20 69 66 28 20 6d 78 50  nPage;.  if( mxP
17540 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
17550 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
17560 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
17570 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17580 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
17590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
175a0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61  ger->mxPgno>=nPa
175b0 67 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ge );.  return p
175c0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
175d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
175e0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
175f0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
17600 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
17610 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
17620 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
17630 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
17640 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
17650 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
17660 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
17670 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
17680 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
17690 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
176a0 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
176b0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
176c0 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
176d0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
176e0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
176f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17700 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
17710 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
17720 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
17730 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
17740 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
17750 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
17760 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
17770 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
17780 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
17790 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
177a0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
177b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
177c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
177d0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
177e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
177f0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
17800 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
17810 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
17820 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
17830 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
17840 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17850 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
17860 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17870 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
17880 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
17890 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
178a0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
178b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
178c0 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
178d0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
178e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
178f0 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
17900 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
17910 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
17920 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
17930 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
17940 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
17950 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
17960 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
17970 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
17980 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
17990 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
179a0 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
179b0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
179c0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
179d0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
179e0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
179f0 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
17a00 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
17a10 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
17a20 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
17a30 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
17a40 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
17a50 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
17a60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17a70 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
17a80 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
17a90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
17aa0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
17ab0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
17ac0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
17ad0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
17ae0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
17af0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
17b00 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
17b10 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
17b20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
17b30 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
17b40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
17b50 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
17b60 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
17b70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17b80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
17b90 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73  File );.  if( is
17ba0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17bb0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
17bc0 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
17bd0 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
17be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17bf0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
17c00 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
17c10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17c20 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
17c30 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
17c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17c50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17c60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17c70 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
17c80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17c90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17ca0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ile associated .
17cb0 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20  ** with pPager. 
17cc0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
17cd0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  s calculated as 
17ce0 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f  (<db file size>/
17cf0 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a  <page-size>)..**
17d00 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
17d10 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
17d20 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
17d30 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
17d40 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
17d50 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
17d60 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a  1 page file..**.
17d70 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
17d80 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  is in error stat
17d90 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
17da0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
17db0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f  then the.** erro
17dc0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
17dd0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
17de0 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20  nd *pnPage left 
17df0 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a  unchanged. Or,.*
17e00 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79  * if the file sy
17e10 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71  stem has to be q
17e20 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73  ueried for the s
17e30 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
17e40 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79  and.** the query
17e50 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73   attempt returns
17e60 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68   an IO error, th
17e70 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
17e80 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
17e90 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
17ea0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
17eb0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
17ec0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
17ed0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e  successful, then
17ee0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17ef0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
17f00 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  nPage is set to 
17f10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17f20 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17f30 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
17f40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17f50 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17f60 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
17f70 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
17f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
17f90 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
17fa0 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
17fb0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
17fc0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
17fd0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
17fe0 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
17ff0 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  code. */.  if( p
18000 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
18010 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
18020 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
18030 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
18040 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
18050 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
18060 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e  e. Store this in
18070 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28   nPage. */.  if(
18080 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
18090 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67  alid ){.    nPag
180a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
180b0 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
180c0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
180d0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
180e0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  r returned by Os
180f0 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20  FileSize() */.  
18100 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
18110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
18120 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
18130 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69  returned by OsFi
18140 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20  leSize() */..   
18150 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
18160 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
18170 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18180 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
18190 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26  n(pPager->fd) &&
181a0 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
181b0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
181c0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29  Pager->fd, &n)))
181d0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
181e0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
181f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18200 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
18210 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
18220 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
18230 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a       nPage = 1;.
18240 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18250 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
18260 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65  n / pPager->page
18270 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
18280 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18290 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
182a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
182b0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
182c0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
182d0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
182e0 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
182f0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
18300 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
18310 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
18320 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
18330 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
18340 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
18350 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  e .  ** configur
18360 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
18370 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
18380 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
18390 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
183a0 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
183b0 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
183c0 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
183d0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
183e0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
183f0 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
18400 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
18410 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e  tput variable an
18420 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18430 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50 61 67 65 20  OK */.  *pnPage 
18440 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
18450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18460 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
18470 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74  tain a lock of t
18480 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20  ype locktype on 
18490 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
184a0 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c  e. If.** a simil
184b0 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ar or greater lo
184c0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
184d0 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ld, this functio
184e0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20  n is a no-op.** 
184f0 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54  (returning SQLIT
18500 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79  E_OK immediately
18510 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
18520 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  se, attempt to o
18530 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75  btain the lock u
18540 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f  sing sqlite3OsLo
18550 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a  ck(). Invoke .**
18560 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
18570 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ck if the lock i
18580 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
18590 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61  available. Repea
185a0 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20  t .** until the 
185b0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
185c0 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75  turns false or u
185d0 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74  ntil the attempt
185e0 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74   to .** obtain t
185f0 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
18600 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
18610 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
18620 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
18630 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
18640 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
18650 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
18660 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73  ck is obtained s
18670 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74  uccessfully, set
18680 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74 65   the Pager.state
18690 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f   .** variable to
186a0 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65   locktype before
186b0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
186c0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
186d0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
186e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
186f0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
18700 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18720 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18730 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53   */..  /* The OS
18740 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
18750 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
18760 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
18770 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
18780 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
18790 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
187a0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
187b0 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
187c0 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
187d0 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
187e0 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
187f0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
18800 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
18810 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
18820 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
18830 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 2e 20  ust be unknown. 
18840 49 74 0a 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74  It.  ** must not
18850 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
18860 69 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ied at this poin
18870 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
18880 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18890 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
188a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
188b0 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73  alid==0 );.  ass
188c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
188d0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
188e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f   || pPager->dbMo
188f0 64 69 66 69 65 64 3d 3d 30 20 29 3b 0a 0a 20 20  dified==0 );..  
18900 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
18910 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
18920 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
18930 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
18940 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
18950 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
18960 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
18970 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
18980 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
18990 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
189a0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
189b0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
189c0 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
189d0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
189e0 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
189f0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
18a00 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  tate>=locktype).
18a10 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
18a20 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
18a30 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  UNLOCK && lockty
18a40 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  pe==PAGER_SHARED
18a50 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
18a60 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
18a70 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f  R_RESERVED && lo
18a80 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58  cktype==PAGER_EX
18a90 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20  CLUSIVE).  );.. 
18aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18ab0 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
18ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18ad0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
18ae0 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
18af0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
18b00 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
18b10 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
18b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
18b30 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
18b40 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
18b50 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
18b60 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  g) );.    if( rc
18b70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18b80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
18b90 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  te = (u8)locktyp
18ba0 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  e;.      IOTRACE
18bb0 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
18bc0 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  , pPager, lockty
18bd0 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe)).    }.  }. 
18be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18bf0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
18c00 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
18c10 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
18c20 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
18c30 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
18c40 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
18c50 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
18c60 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
18c70 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
18c80 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
18c90 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
18ca0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
18cb0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
18cc0 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
18cd0 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
18ce0 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
18cf0 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
18d00 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
18d10 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
18d20 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
18d30 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
18d40 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
18d50 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
18d60 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
18d70 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
18d80 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
18d90 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
18da0 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
18db0 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
18dc0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
18dd0 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
18de0 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
18df0 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
18e00 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
18e10 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
18e20 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
18e30 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
18e40 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
18e50 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
18e60 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
18e70 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
18e80 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
18e90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18ea0 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
18eb0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
18ec0 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
18ed0 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
18ee0 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
18ef0 63 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75  ct behaviour wou
18f00 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
18f10 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
18f20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
18f30 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
18f40 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
18f50 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
18f60 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
18f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
18f80 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
18f90 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
18fa0 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
18fb0 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
18fc0 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
18fd0 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
18fe0 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
18ff0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
19000 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
19010 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
19020 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
19030 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
19040 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
19050 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
19060 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19070 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
19080 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
19090 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
190a0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
190b0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
190c0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
190d0 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
190e0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
190f0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
19100 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
19110 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
19120 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
19130 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
19140 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
19150 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
19160 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
19170 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
19180 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
19190 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
191a0 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
191b0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
191c0 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
191d0 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
191e0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
191f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
19200 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
19210 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
19220 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
19230 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
19240 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
19250 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
19260 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
19270 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
19280 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
19290 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
192a0 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
192b0 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
192c0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
192d0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
192e0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
192f0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
19300 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
19310 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
19320 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19330 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
19340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19350 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
19360 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
19370 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
19380 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
19390 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
193a0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 61 73 73 65   = nPage;.  asse
193b0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
193c0 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  aint(pPager);.}.
193d0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
193e0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
193f0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
19400 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
19410 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
19420 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
19430 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
19440 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
19450 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
19460 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
19470 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
19480 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
19490 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
194a0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
194b0 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
194c0 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
194d0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
194e0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
194f0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
19500 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
19510 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
19520 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
19530 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
19540 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
19550 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
19560 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
19570 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
19580 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
19590 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
195a0 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
195b0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
195c0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
195d0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
195e0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
195f0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
19600 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
19610 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
19620 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
19630 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
19640 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
19650 72 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  r){.  disable_si
19660 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
19670 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
19680 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
19690 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
196a0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
196b0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
196c0 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
196d0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
196e0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
196f0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
19700 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
19710 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
19720 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
19730 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
19740 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
19750 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
19760 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
19770 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
19780 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
19790 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
197a0 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
197b0 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
197c0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
197d0 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
197e0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
197f0 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
19800 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
19810 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
19820 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
19830 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
19840 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
19850 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
19860 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
19870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
19880 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
19890 20 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e   -1;.    pagerUn
198a0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
198b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
198c0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
198d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
198e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
198f0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
19900 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
19910 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
19920 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
19930 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
19940 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
19950 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
19960 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
19970 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
19980 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
19990 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
199a0 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
199b0 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
199c0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
199d0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
199e0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
199f0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
19a00 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
19a10 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
19a20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
19a30 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
19a40 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
19a50 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19a60 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
19a70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
19a80 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
19a90 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
19aa0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19ab0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
19ac0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
19ad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
19ae0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
19af0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
19b00 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
19b10 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
19b20 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
19b30 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
19b40 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
19b50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19b60 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
19b70 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
19b80 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
19b90 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19ba0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
19bb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
19bc0 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
19bd0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
19be0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
19bf0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
19c00 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
19c10 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
19c20 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
19c30 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
19c40 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
19c50 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
19c60 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
19c70 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
19c80 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
19c90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
19ca0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
19cb0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
19cc0 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
19cd0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
19ce0 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
19cf0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
19d00 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
19d10 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
19d20 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
19d30 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
19d40 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
19d50 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
19d60 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
19d70 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
19d80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19d90 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
19da0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
19db0 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
19dc0 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
19dd0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
19de0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
19df0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
19e00 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
19e10 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
19e20 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
19e30 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
19e40 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
19e50 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
19e60 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
19e70 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
19e80 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
19e90 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
19ea0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
19eb0 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
19ec0 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
19ed0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
19ee0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
19ef0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
19f00 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
19f10 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
19f20 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
19f30 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
19f40 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
19f50 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
19f60 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
19f70 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
19f80 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
19f90 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
19fa0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
19fb0 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
19fc0 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
19fd0 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
19fe0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
19ff0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1a000 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1a010 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1a020 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1a030 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1a040 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1a050 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1a060 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1a070 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1a080 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1a090 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1a0a0 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1a0b0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1a0c0 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1a0d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a0e0 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1a0f0 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1a100 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1a110 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1a120 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1a130 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1a140 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1a150 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1a160 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1a170 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1a180 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1a190 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1a1a0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1a1b0 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1a1c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1a1d0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1a1e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a1f0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1a200 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a210 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1a220 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a230 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1a240 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1a250 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1a260 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1a270 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1a280 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1a290 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1a2a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1a2b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a2d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1a2e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1a2f0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1a300 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a310 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1a320 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a330 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a340 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1a350 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1a360 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1a370 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1a380 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1a390 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1a3a0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1a3b0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1a3c0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1a3d0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1a3e0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1a3f0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1a400 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1a410 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1a420 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1a430 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1a440 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1a450 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1a460 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1a470 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1a480 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1a490 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1a4a0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1a4b0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1a4c0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1a4d0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1a4e0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1a4f0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1a500 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73  onnections trans
1a510 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1a520 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1a530 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1a540 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1a550 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1a560 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1a570 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1a580 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1a590 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1a5a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1a5b0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1a5c0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1a5d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1a5e0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1a5f0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1a600 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1a610 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1a620 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1a630 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1a640 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1a650 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1a660 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1a670 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1a680 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1a690 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1a6a0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1a6b0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1a6c0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1a6d0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1a6e0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1a6f0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1a700 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1a710 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1a720 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1a730 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1a740 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1a750 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1a760 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1a770 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1a780 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1a790 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1a7a0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1a7b0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1a7c0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1a7d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1a7e0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1a7f0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1a800 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1a810 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1a820 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1a830 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1a840 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1a850 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1a860 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1a870 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1a880 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1a890 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1a8a0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1a8b0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1a8c0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1a8d0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1a8e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1a8f0 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1a900 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1a910 67 69 63 5b 38 5d 3b 0a 09 75 38 20 7a 48 65 61  gic[8];..u8 zHea
1a920 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
1a930 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 09  nalMagic)+4];...
1a940 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
1a950 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
1a960 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1a970 67 69 63 29 29 3b 0a 09 70 75 74 33 32 62 69 74  gic));..put32bit
1a980 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
1a990 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1a9a0 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
1a9b0 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
1a9c0 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
1a9d0 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
1a9e0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
1a9f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1aa00 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
1aa10 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
1aa20 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1aa30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aa40 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
1aa50 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
1aa60 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
1aa70 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
1aa80 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
1aa90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1aaa0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1aab0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1aac0 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
1aad0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1aae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1aaf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ab00 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1ab10 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1ab20 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1ab30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ab40 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1ab50 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
1ab60 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
1ab70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
1ab80 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
1ab90 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
1aba0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
1abb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
1abc0 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
1abd0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1abe0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
1abf0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
1ac00 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
1ac10 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
1ac20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
1ac30 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
1ac40 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
1ac50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1ac60 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
1ac70 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
1ac80 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
1ac90 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
1aca0 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
1acb0 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
1acc0 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
1acd0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
1ace0 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
1acf0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
1ad00 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
1ad10 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
1ad20 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
1ad30 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
1ad40 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
1ad50 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
1ad60 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1ad70 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
1ad80 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
1ad90 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1ada0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1adb0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1adc0 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
1add0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1ade0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
1adf0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1ae00 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1ae10 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1ae20 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1ae30 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
1ae40 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1ae50 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1ae60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ae70 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1ae80 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1ae90 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
1aea0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1aeb0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1aec0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1aed0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1aee0 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
1aef0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
1af00 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
1af10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1af20 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
1af30 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1af40 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
1af50 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
1af60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1af70 72 0a 09 29 3b 0a 20 20 20 20 20 20 20 20 69 66  r..);.        if
1af80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1af90 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1afa0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
1afb0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1afc0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
1afd0 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
1afe0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1aff0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1b000 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1b010 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
1b020 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
1b030 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
1b040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b050 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1b060 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1b070 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
1b080 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
1b090 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
1b0a0 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
1b0b0 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
1b0c0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1b0d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b0e0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b0f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1b100 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
1b110 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
1b120 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
1b130 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e  nced. Set Pager.
1b140 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
1b150 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65   to zero and cle
1b160 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
1b170 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61  D_SYNC flag on a
1b180 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a  ll pagess..    *
1b190 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  /.    pPager->ne
1b1a0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1b1b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1b1c0 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
1b1d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
1b1e0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
1b1f0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1b200 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1b210 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b220 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1b230 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
1b240 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
1b250 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
1b260 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
1b270 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
1b280 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1b290 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
1b2a0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
1b2b0 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
1b2c0 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
1b2d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1b2e0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
1b2f0 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
1b300 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
1b310 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
1b320 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
1b330 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
1b340 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
1b350 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
1b360 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
1b370 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
1b380 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
1b390 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
1b3a0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
1b3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b3c0 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
1b3d0 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
1b3e0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1b3f0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
1b400 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
1b410 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
1b420 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1b430 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
1b440 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
1b450 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
1b460 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1b470 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
1b480 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
1b490 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
1b4a0 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
1b4b0 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
1b4c0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
1b4d0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1b4e0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
1b4f0 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
1b500 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
1b510 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
1b520 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
1b530 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
1b540 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
1b550 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1b560 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b570 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
1b580 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
1b590 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
1b5a0 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
1b5b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1b5c0 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
1b5d0 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
1b5e0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
1b5f0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1b600 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
1b610 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1b620 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
1b630 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
1b640 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
1b650 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
1b660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1b670 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
1b680 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
1b690 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
1b6a0 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
1b6b0 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
1b6c0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
1b6d0 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
1b6e0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1b6f0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
1b700 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
1b710 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
1b720 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1b730 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1b740 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1b750 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1b760 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1b770 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
1b780 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
1b790 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1b7a0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
1b7b0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
1b7c0 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
1b7d0 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
1b7e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b7f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b800 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
1b810 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
1b820 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b840 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1b850 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
1b860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b880 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1b890 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c  ..  if( NEVER(pL
1b8a0 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  ist==0) ) return
1b8b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
1b8c0 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
1b8d0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
1b8e0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1b8f0 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
1b900 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
1b910 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1b920 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
1b930 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
1b940 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
1b950 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
1b960 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
1b970 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
1b980 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
1b990 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
1b9a0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
1b9b0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
1b9c0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
1b9d0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
1b9e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
1b9f0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
1ba00 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
1ba10 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
1ba20 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
1ba30 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1ba40 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
1ba50 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
1ba60 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
1ba70 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
1ba80 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
1ba90 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
1baa0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
1bab0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
1bac0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
1bad0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
1bae0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
1baf0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
1bb00 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
1bb10 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
1bb20 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1bb30 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
1bb40 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
1bb50 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
1bb60 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
1bb70 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
1bb80 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
1bb90 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1bba0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
1bbb0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
1bbc0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
1bbd0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1bbe0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
1bbf0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
1bc00 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
1bc10 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
1bc20 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
1bc30 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1bc40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1bc50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1bc60 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
1bc70 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1bc80 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1bc90 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  K);..  /* If the
1bca0 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
1bcb0 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1bcc0 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1bcd0 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
1bce0 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
1bcf0 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
1bd00 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1bd10 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
1bd20 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
1bd30 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
1bd40 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
1bd50 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
1bd60 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
1bd70 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
1bd80 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
1bd90 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1bda0 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
1bdb0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
1bdc0 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
1bdd0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1bde0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
1bdf0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68  lags);.  }..  wh
1be00 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1be10 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
1be20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
1be30 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
1be40 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1be50 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
1be60 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
1be70 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1be80 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
1be90 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1bea0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
1beb0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1bec0 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
1bed0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
1bee0 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
1bef0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
1bf00 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1bf10 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
1bf20 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
1bf30 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
1bf40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1bf50 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
1bf60 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
1bf70 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
1bf80 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
1bf90 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
1bfa0 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
1bfb0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1bfc0 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
1bfd0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
1bfe0 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
1bff0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
1c000 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
1c010 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
1c020 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1c030 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1c040 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
1c050 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
1c060 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c090 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
1c0a0 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
1c0b0 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
1c0c0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
1c0d0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1c0e0 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
1c0f0 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
1c100 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1c110 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
1c120 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
1c130 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
1c140 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1c150 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
1c160 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1c170 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
1c180 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
1c190 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
1c1a0 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
1c1b0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
1c1c0 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
1c1d0 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
1c1e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
1c1f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
1c200 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
1c210 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
1c220 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
1c230 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
1c240 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
1c250 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1c260 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1c270 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1c280 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c290 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
1c2a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1c2b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1c2c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1c2d0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
1c2e0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
1c2f0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1c300 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
1c310 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
1c320 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
1c330 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
1c340 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1c350 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
1c360 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
1c370 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
1c380 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
1c390 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
1c3a0 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
1c3b0 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
1c3c0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1c3d0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1c3f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1c400 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1c410 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
1c420 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
1c430 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
1c440 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
1c450 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1c460 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1c470 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
1c480 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1c490 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
1c4a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1c4b0 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
1c4c0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
1c4d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c4e0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
1c4f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1c500 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1c510 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
1c520 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1c530 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
1c540 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
1c550 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
1c560 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c570 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
1c580 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
1c590 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
1c5a0 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
1c5b0 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74  -journal. .** It
1c5c0 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
1c5d0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
1c5e0 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72  o use subjRequir
1c5f0 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63  esPage() to chec
1c600 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  k .** that it is
1c610 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
1c620 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
1c630 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1c640 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1c650 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
1c660 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1c670 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
1c680 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
1c690 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
1c6a0 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
1c6b0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
1c6c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1c6d0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
1c6e0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
1c6f0 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
1c700 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
1c710 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
1c720 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
1c730 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
1c740 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
1c750 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
1c760 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
1c770 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
1c780 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
1c790 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
1c7a0 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
1c7b0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1c7c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c7d0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1c7e0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1c7f0 72 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  r;.  if( isOpen(
1c800 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
1c810 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
1c820 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
1c830 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1c840 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
1c850 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
1c860 69 7a 65 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ize);.    char *
1c870 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 43 4f 44  pData2;..    COD
1c880 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1c890 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
1c8a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c8b0 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
1c8c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1c8d0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1c8e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1c8f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1c900 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20  ->pgno));.  .   
1c910 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
1c920 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
1c930 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1c940 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
1c950 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1c960 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
1c970 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
1c980 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
1c990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c9a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c9b0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1c9c0 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
1c9d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1c9e0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
1c9f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1ca00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ca10 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
1ca20 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
1ca30 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
1ca40 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
1ca50 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
1ca60 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
1ca70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
1ca80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1ca90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1caa0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
1cab0 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
1cac0 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
1cad0 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
1cae0 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
1caf0 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
1cb00 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
1cb10 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
1cb20 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
1cb30 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
1cb40 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
1cb50 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
1cb60 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
1cb70 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
1cb80 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
1cb90 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
1cba0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
1cbb0 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
1cbc0 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
1cbd0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1cbe0 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
1cbf0 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
1cc00 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
1cc10 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
1cc20 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
1cc30 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
1cc40 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
1cc50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cc60 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
1cc70 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
1cc80 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
1cc90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1cca0 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
1ccb0 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
1ccc0 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
1ccd0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1cce0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
1ccf0 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
1cd00 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
1cd10 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
1cd20 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
1cd30 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1cd40 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1cd50 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
1cd60 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
1cd70 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
1cd80 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
1cd90 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
1cda0 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
1cdb0 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
1cdc0 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
1cdd0 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
1cde0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1cdf0 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
1ce00 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
1ce10 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
1ce20 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
1ce30 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
1ce40 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
1ce50 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
1ce60 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1ce70 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1ce80 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
1ce90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1cea0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
1ceb0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
1cec0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
1ced0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
1cee0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
1cef0 74 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  tSync flag is se
1cf00 74 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  t by the sqlite3
1cf10 50 61 67 65 72 57 72 69 74 65 28 29 20 66 75 6e  PagerWrite() fun
1cf20 63 74 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20  ction while it. 
1cf30 20 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69   ** is journalli
1cf40 6e 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20  ng a set of two 
1cf50 6f 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65  or more database
1cf60 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
1cf70 73 74 6f 72 65 64 0a 20 20 2a 2a 20 6f 6e 20 74  stored.  ** on t
1cf80 68 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63  he same disk sec
1cf90 74 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68 65  tor. Syncing the
1cfa0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
1cfb0 61 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20 20  allowed while.  
1cfc0 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
1cfd0 6e 69 6e 67 20 61 73 20 69 74 20 69 73 20 69 6d  ning as it is im
1cfe0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c  portant that all
1cff0 20 6d 65 6d 62 65 72 73 20 6f 66 20 73 75 63 68   members of such
1d000 20 61 0a 20 20 2a 2a 20 73 65 74 20 6f 66 20 70   a.  ** set of p
1d010 61 67 65 73 20 61 72 65 20 73 79 6e 63 65 64 20  ages are synced 
1d020 74 6f 20 64 69 73 6b 20 74 6f 67 65 74 68 65 72  to disk together
1d030 2e 20 53 6f 2c 20 69 66 20 74 68 65 20 70 61 67  . So, if the pag
1d040 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  e this function.
1d050 20 20 2a 2a 20 69 73 20 74 72 79 69 6e 67 20 74    ** is trying t
1d060 6f 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c  o make clean wil
1d070 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
1d080 6e 61 6c 20 73 79 6e 63 20 61 6e 64 20 74 68 65  nal sync and the
1d090 20 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 2a 2a 20   doNotSync.  ** 
1d0a0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 72 65 74  flag is set, ret
1d0b0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1d0c0 67 20 61 6e 79 74 68 69 6e 67 2e 20 54 68 65 20  g anything. The 
1d0d0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 69 6c  pcache layer wil
1d0e0 6c 0a 20 20 2a 2a 20 6a 75 73 74 20 68 61 76 65  l.  ** just have
1d0f0 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
1d100 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
1d110 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 73 74  page buffer inst
1d120 65 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 75 73  ead of.  ** reus
1d130 69 6e 67 20 70 50 67 2e 0a 20 20 2a 2a 0a 20 20  ing pPg..  **.  
1d140 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66  ** Similarly, if
1d150 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
1d160 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
1d170 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
1d180 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 20  do not.  ** try 
1d190 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e  to write the con
1d1a0 74 65 6e 74 73 20 6f 66 20 70 50 67 20 74 6f 20  tents of pPg to 
1d1b0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
1d1c0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
1d1d0 72 72 43 6f 64 65 29 0a 20 20 20 7c 7c 20 28 70  rrCode).   || (p
1d1e0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1d1f0 20 26 26 20 70 50 67 2d 3e 66 6c 61 67 73 26 50   && pPg->flags&P
1d200 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 0a  GHDR_NEED_SYNC).
1d210 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1d220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1d230 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
1d240 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
1d250 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
1d260 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d270 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
1d280 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
1d290 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1d2a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d2b0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
1d2c0 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20  llSync && .     
1d2d0 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   !(pPager->journ
1d2e0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1d2f0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1d300 29 20 26 26 0a 20 20 20 20 20 20 21 28 73 71 6c  ) &&.      !(sql
1d310 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1d320 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1d330 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
1d340 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1d350 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
1d360 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1d370 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
1d380 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
1d390 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1d3a0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1d3b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
1d3c0 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
1d3d0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
1d3e0 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  size of.  ** the
1d3f0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
1d400 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
1d410 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
1d420 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
1d430 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
1d440 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
1d450 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1d460 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
1d470 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63 74 75 61  l not.  ** actua
1d480 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
1d490 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
1d4a0 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
1d4b0 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
1d4c0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
1d4d0 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
1d4e0 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  **.  **   BEGIN;
1d4f0 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e  .  **     <journ
1d500 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20  al page X>.  ** 
1d510 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
1d520 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56   X>.  **     SAV
1d530 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 2a 2a 20  EPOINT sp;.  ** 
1d540 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
1d550 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
1d560 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20 20 20 20   pages>.  **    
1d570 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
1d580 61 67 65 20 58 29 0a 20 20 2a 2a 20 20 20 20 20  age X).  **     
1d590 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
1d5a0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 28 58 3e    **.  ** If (X>
1d5b0 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
1d5c0 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
1d5d0 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
1d5e0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
1d5f0 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
1d600 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
1d610 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
1d620 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
1d630 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f 6c  . Then,.  ** fol
1d640 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
1d650 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
1d660 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
1d670 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
1d680 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1d690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d6a0 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
1d6b0 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
1d6c0 58 20 61 73 20 69 74 0a 20 20 2a 2a 20 77 61 73  X as it.  ** was
1d6d0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1d6e0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
1d6f0 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
1d700 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
1d710 0a 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74  .  ** was execut
1d720 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
1d730 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
1d740 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1d750 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
1d760 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a   X into the .  *
1d770 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
1d780 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
1d790 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
1d7a0 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
1d7b0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 73  will.  ** be res
1d7c0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
1d7d0 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
1d7e0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1d7f0 20 73 70 22 20 69 73 20 0a 20 20 2a 2a 20 65 78   sp" is .  ** ex
1d800 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  ecuted..  */.  i
1d810 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20  f( NEVER(.      
1d820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d830 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
1d840 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
1d850 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
1d860 67 29 0a 20 20 29 20 29 7b 0a 20 20 20 20 72 63  g).  ) ){.    rc
1d870 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
1d880 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  e(pPg);.  }..  /
1d890 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
1d8a0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
1d8b0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1d8c0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1d8d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d8e0 4b 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44  K ){.    pPg->pD
1d8f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
1d900 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1d910 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1d920 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
1d930 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
1d940 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1d950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
1d960 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
1d970 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
1d980 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d990 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1d9a0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1d9b0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
1d9c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
1d9d0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1d9e0 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  , rc);.}.../*.**
1d9f0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
1da00 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
1da10 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
1da20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
1da30 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
1da40 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
1da50 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
1da60 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
1da70 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
1da80 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
1da90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
1daa0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
1dab0 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
1dac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1dad0 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
1dae0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
1daf0 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
1db00 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
1db10 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1db20 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
1db30 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
1db40 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
1db50 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
1db60 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
1db70 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
1db80 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
1db90 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
1dba0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
1dbb0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
1dbc0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
1dbd0 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
1dbe0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
1dbf0 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
1dc00 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1dc10 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
1dc20 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1dc30 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
1dc40 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
1dc50 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1dc60 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
1dc70 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
1dc80 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
1dc90 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
1dca0 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
1dcb0 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
1dcc0 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
1dcd0 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
1dce0 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
1dcf0 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
1dd00 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
1dd10 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
1dd20 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
1dd30 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
1dd40 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
1dd50 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
1dd60 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
1dd70 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
1dd80 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  R_OMIT_JOURNAL a
1dd90 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44  nd PAGER_NO_READ
1dda0 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  LOCK flags..**.*
1ddb0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
1ddc0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
1ddd0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
1dde0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
1ddf0 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
1de00 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
1de10 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
1de20 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
1de30 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
1de40 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
1de50 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1de60 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
1de70 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
1de80 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
1de90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1dea0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
1deb0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1dec0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
1ded0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
1dee0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
1def0 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
1df00 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
1df10 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
1df20 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1df30 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1df40 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
1df50 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
1df60 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
1df70 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
1df80 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
1df90 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
1dfa0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
1dfb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1dfc0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
1dfd0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1dfe0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
1dff0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
1e000 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
1e010 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
1e020 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
1e030 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1e040 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
1e050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e060 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
1e070 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e080 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
1e090 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1e0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1e0b0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
1e0c0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
1e0d0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
1e0e0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
1e0f0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
1e100 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
1e110 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
1e120 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
1e130 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
1e140 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
1e150 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
1e160 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
1e170 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
1e180 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
1e190 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
1e1a0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
1e1b0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
1e1c0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
1e1d0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
1e1e0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
1e1f0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
1e200 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1e210 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e220 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
1e230 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
1e240 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
1e250 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
1e260 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
1e270 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
1e280 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1e290 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1e2a0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
1e2b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
1e2c0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
1e2d0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1e2e0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
1e2f0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
1e300 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
1e310 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
1e320 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
1e330 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
1e340 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
1e350 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
1e360 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
1e370 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1e380 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
1e390 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e3a0 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
1e3b0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
1e3c0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
1e3d0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
1e3e0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
1e3f0 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
1e400 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
1e410 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
1e420 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
1e430 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20  ADLOCK)!=0;  /* 
1e440 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61  True to omit rea
1e450 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d-lock */.  int 
1e460 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
1e470 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
1e480 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
1e490 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
1e4a0 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36   PCache */.  u16
1e4b0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
1e4c0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1e4d0 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
1e4e0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
1e4f0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1e500 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
1e510 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
1e520 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
1e530 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
1e540 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
1e550 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
1e560 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
1e570 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
1e580 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
1e590 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
1e5a0 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
1e5b0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
1e5c0 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
1e5d0 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
1e5e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
1e5f0 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
1e600 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
1e610 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
1e620 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
1e630 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
1e640 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
1e650 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
1e660 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
1e670 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
1e680 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
1e690 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
1e6a0 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
1e6b0 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
1e6c0 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
1e6d0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
1e6e0 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
1e6f0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
1e700 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
1e710 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
1e720 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
1e730 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
1e740 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
1e750 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
1e760 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
1e770 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
1e780 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
1e790 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
1e7a0 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
1e7b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
1e7c0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
1e7d0 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
1e7e0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
1e7f0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
1e800 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
1e810 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
1e820 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
1e830 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
1e840 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
1e850 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
1e860 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
1e870 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
1e880 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
1e890 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
1e8a0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
1e8b0 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
1e8c0 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
1e8d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1e8e0 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
1e8f0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1e900 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
1e910 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
1e920 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1e930 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1e940 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e950 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
1e960 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
1e970 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
1e980 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
1e990 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
1e9a0 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
1e9b0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  0] = 0;.    }els
1e9c0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
1e9d0 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
1e9e0 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
1e9f0 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
1ea00 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
1ea10 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
1ea20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ea30 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
1ea40 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
1ea50 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
1ea60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a  thname);.    }..
1ea70 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
1ea80 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1ea90 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1eaa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1eab0 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
1eac0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1ead0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
1eae0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
1eaf0 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
1eb00 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
1eb10 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
1eb20 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
1eb30 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
1eb40 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
1eb50 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
1eb60 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
1eb70 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
1eb80 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1eb90 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
1eba0 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
1ebb0 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
1ebc0 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
1ebd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
1ebe0 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
1ebf0 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
1ec00 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
1ec10 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
1ec20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ec30 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
1ec40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1ec50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ec60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1ec70 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
1ec80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ec90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
1eca0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
1ecb0 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
1ecc0 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
1ecd0 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
1ece0 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
1ecf0 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
1ed00 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
1ed10 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
1ed20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
1ed30 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
1ed40 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
1ed50 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
1ed60 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed80 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
1ed90 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1eda0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edc0 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
1edd0 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
1ede0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
1edf0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
1ee00 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
1ee10 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
1ee20 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
1ee30 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
1ee40 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
1ee50 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
1ee60 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
1ee70 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
1ee80 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
1ee90 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
1eea0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
1eeb0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
1eec0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
1eed0 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
1eee0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
1eef0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
1ef00 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
1ef10 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
1ef20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
1ef30 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1ef40 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
1ef50 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
1ef60 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
1ef70 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
1ef80 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
1ef90 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
1efa0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
1efb0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
1efc0 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
1efd0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
1efe0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
1eff0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
1f000 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
1f010 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
1f020 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
1f030 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20  Pathname + 1 +  
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f050 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
1f060 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
1f070 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  + 1             
1f080 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
1f090 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45    );.  assert( E
1f0a0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1f0b0 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ENT(SQLITE_INT_T
1f0c0 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c  O_PTR(journalFil
1f0d0 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28  eSize)) );.  if(
1f0e0 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71   !pPtr ){.    sq
1f0f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
1f100 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
1f110 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1f120 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
1f130 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
1f140 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
1f150 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
1f160 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
1f170 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
1f180 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
1f190 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
1f1a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
1f1b0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
1f1c0 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
1f1d0 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
1f1e0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
1f1f0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
1f200 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
1f210 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
1f220 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
1f230 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
1f240 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
1f250 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
1f260 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
1f270 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
1f280 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
1f290 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1f2a0 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
1f2b0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
1f2c0 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
1f2d0 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
1f2e0 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
1f2f0 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
1f300 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
1f310 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  e ){.    pPager-
1f320 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
1f330 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
1f340 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20  athname + 1);.  
1f350 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
1f360 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
1f370 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
1f380 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
1f390 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1f3a0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
1f3b0 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
1f3c0 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
1f3d0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
1f3e0 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a  "-journal", 8);.
1f3f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1f400 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20  zFilename[0]==0 
1f410 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  ) pPager->zJourn
1f420 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73  al[0] = 0;.    s
1f430 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1f440 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
1f450 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
1f460 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
1f470 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
1f480 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
1f490 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
1f4a0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
1f4b0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
1f4c0 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20  ] && !memDb ){. 
1f4d0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
1f500 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
1f510 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
1f520 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1f530 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
1f540 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
1f550 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
1f560 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  out);.    readOn
1f570 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
1f580 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
1f590 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1f5a0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
1f5b0 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
1f5c0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
1f5d0 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
1f5e0 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
1f5f0 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
1f600 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
1f610 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1f620 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
1f630 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1f640 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
1f650 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1f660 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
1f670 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
1f680 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
1f690 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1f6a0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
1f6b0 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
1f6c0 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
1f6d0 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
1f6e0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
1f6f0 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
1f700 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1f710 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
1f720 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
1f730 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
1f740 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
1f750 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
1f760 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
1f770 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f780 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
1f790 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
1f7a0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1f7b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
1f7c0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
1f7d0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
1f7e0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1f7f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
1f800 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
1f810 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f820 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
1f830 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f840 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
1f850 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63  (u16)pPager->sec
1f860 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
1f870 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
1f880 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f890 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
1f8a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
1f8b0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1f8c0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1f8d0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1f8e0 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
1f8f0 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
1f900 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
1f910 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
1f920 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
1f930 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
1f940 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
1f950 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
1f960 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
1f970 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f980 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
1f990 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
1f9a0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
1f9b0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f9c0 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
1f9d0 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
1f9e0 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
1f9f0 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
1fa00 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
1fa10 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1fa20 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
1fa30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fa40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1fa50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1fa60 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
1fa70 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
1fa80 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
1fa90 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
1faa0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
1fab0 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
1fac0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
1fad0 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
1fae0 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
1faf0 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
1fb00 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
1fb10 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
1fb20 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fb30 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
1fb40 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
1fb50 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1fb60 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
1fb70 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1fb80 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
1fb90 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
1fba0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1fbb0 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
1fbc0 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
1fbd0 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
1fbe0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
1fbf0 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
1fc00 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1fc10 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1fc20 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 72  EXCLUSIVE;.    r
1fc30 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
1fc40 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
1fc50 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
1fc60 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1fc70 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
1fc80 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
1fc90 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
1fca0 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
1fcb0 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
1fcc0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
1fcd0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
1fce0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
1fcf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fd00 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1fd10 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
1fd20 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
1fd30 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
1fd40 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
1fd50 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
1fd60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1fd70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1fd80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
1fd90 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
1fda0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
1fdb0 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
1fdc0 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
1fdd0 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
1fde0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
1fdf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
1fe00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fe10 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1fe20 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
1fe30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
1fe40 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
1fe50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1fe60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
1fe70 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
1fe80 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1fe90 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
1fea0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
1feb0 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
1fec0 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
1fed0 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
1fee0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
1fef0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
1ff00 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
1ff10 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
1ff20 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
1ff30 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
1ff40 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
1ff50 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
1ff60 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
1ff70 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
1ff80 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
1ff90 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
1ffa0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
1ffb0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
1ffc0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
1ffd0 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
1ffe0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
1fff0 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
20000 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
20010 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
20020 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
20030 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
20040 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
20050 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20060 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
20070 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
20080 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
20090 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
200a0 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  id = (u8)memDb;.
200b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
200c0 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
200d0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
200e0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
200f0 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
20100 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
20110 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
20120 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
20130 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
20140 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
20150 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  OCK; */.  assert
20160 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
20170 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
20180 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
20190 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
201a0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
201b0 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
201c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
201d0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
201e0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
201f0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
20200 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
20210 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
20220 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
20230 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
20240 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
20250 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
20260 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
20270 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
20280 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
20290 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
202a0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
202b0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
202c0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
202d0 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
202e0 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
202f0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
20300 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
20310 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
20320 20 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   0; */.  assert(
20330 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
20340 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
20350 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
20360 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
20370 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
20380 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61  ->fullSync = pPa
20390 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31  ger->noSync ?0:1
203a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
203b0 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  _flags = SQLITE_
203c0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f  SYNC_NORMAL;.  /
203d0 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
203e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
203f0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
20400 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
20410 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
20420 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
20430 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
20440 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
20450 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
20460 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
20470 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
20480 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
20490 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
204a0 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
204b0 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
204c0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
204d0 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
204e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
204f0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
20500 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
20510 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
20520 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
20530 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
20540 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20550 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
20560 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
20570 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
20580 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
20590 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
205a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
205b0 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
205c0 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  it;.  /* memset(
205d0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
205e0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
205f0 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20  >aHash)); */..  
20600 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
20610 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
20620 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
20630 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20640 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
20650 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
20660 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
20670 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
20680 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
20690 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
206a0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
206b0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
206c0 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
206d0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
206e0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
206f0 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
20700 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
20710 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
20720 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
20730 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
20740 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
20750 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
20760 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
20770 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
20780 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
20790 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
207a0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
207b0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
207c0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
207d0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
207e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
207f0 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
20800 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
20810 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
20820 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
20830 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
20840 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
20850 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
20860 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
20870 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
20880 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
20890 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
208a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
208b0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
208c0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
208d0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
208e0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
208f0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
20900 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
20910 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
20920 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
20930 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
20940 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
20950 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
20960 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
20970 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
20980 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
20990 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
209a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
209b0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
209c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
209d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
209e0 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
209f0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
20a00 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
20a10 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
20a20 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
20a30 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
20a40 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
20a50 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
20a60 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
20a70 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
20a80 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
20a90 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
20aa0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
20ab0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
20ac0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
20ad0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
20ae0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
20af0 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
20b00 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
20b10 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
20b20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20b30 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
20b40 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
20b50 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
20b60 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
20b70 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
20b80 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
20b90 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
20ba0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
20bb0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
20bc0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
20bd0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
20be0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
20bf0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
20c00 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
20c10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
20c20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
20c30 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
20c40 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
20c50 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
20c60 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
20c70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
20c80 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
20c90 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
20ca0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
20cb0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
20cc0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
20cd0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cf0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20d00 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
20d10 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
20d20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20d30 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
20d40 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
20d50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20d60 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
20d70 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
20d80 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
20d90 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20da0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
20db0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
20dc0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65  ->jfd) );.  asse
20dd0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
20de0 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45  e <= PAGER_SHARE
20df0 44 20 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73  D );..  *pExists
20e00 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
20e10 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
20e20 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
20e30 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
20e40 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
20e50 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ts);.  if( rc==S
20e60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
20e70 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f  ts ){.    int lo
20e80 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  cked;           
20e90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20ea0 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f   some process ho
20eb0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
20ec0 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ock */..    /* R
20ed0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65  ace condition he
20ee0 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f  re:  Another pro
20ef0 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20  cess might have 
20f00 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65  been holding the
20f10 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45  .    ** the RESE
20f20 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61  RVED lock and ha
20f30 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65  ve a journal ope
20f40 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  n at the sqlite3
20f50 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20  OsAccess() .    
20f60 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62  ** call above, b
20f70 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ut then delete t
20f80 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64  he journal and d
20f90 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66  rop the lock bef
20fa0 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65  ore.    ** we ge
20fb0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
20fc0 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  ng sqlite3OsChec
20fd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20  kReservedLock() 
20fe0 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20  call.  If that. 
20ff0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73     ** is the cas
21000 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
21010 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72  might think ther
21020 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
21030 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69  al when.    ** i
21040 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20  n fact there is 
21050 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75  none.  This resu
21060 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70  lts in a false-p
21070 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69  ositive which wi
21080 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  ll.    ** be dea
21090 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70  lt with by the p
210a0 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  layback routine.
210b0 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a    Ticket #3883..
210c0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
210d0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
210e0 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
210f0 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b  r->fd, &locked);
21100 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21110 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65  ITE_OK && !locke
21120 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  d ){.      int n
21130 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Page;..      /* 
21140 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f  Check the size o
21150 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21160 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69  ile. If it consi
21170 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a  sts of 0 pages,.
21180 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65        ** then de
21190 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
211a0 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68   file. See the h
211b0 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62  eader comment ab
211c0 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a  ove for .      *
211d0 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20  * the reasoning 
211e0 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68  here.  Delete th
211f0 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  e obsolete journ
21200 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20  al file under.  
21210 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45      ** a RESERVE
21220 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20  D lock to avoid 
21230 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  race conditions 
21240 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f  and to avoid vio
21250 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lating.      ** 
21260 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20  [H33020]..      
21270 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
21280 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
21290 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
212a0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
212b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
212c0 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
212d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
212e0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
212f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
21300 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
21310 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
21320 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
21330 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
21340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
21350 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
21360 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
21370 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
21380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21390 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
213a0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
213b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
213c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
213d0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
213e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
213f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21400 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
21410 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
21420 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
21430 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
21440 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
21450 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
21460 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
21470 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
21480 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
21490 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
214a0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
214b0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
214c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
214d0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
214e0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
214f0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
21500 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
21510 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
21520 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
21530 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
21540 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21550 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
21560 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
21570 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
21580 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
21590 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
215a0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
215b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
215c0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
215d0 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
215e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
215f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
21600 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
21610 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21620 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
21630 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
21640 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
21650 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
21670 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
21680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
21690 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
216a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
216b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
216c0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
216d0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
216e0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
216f0 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
21700 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
21710 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
21720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21730 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
21740 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
21750 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
21760 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
21770 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
21780 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
21790 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
217a0 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
217b0 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
217c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
217d0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
217e0 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
217f0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
21800 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
21810 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
21820 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
21830 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
21840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
21850 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
21860 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
21870 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
21880 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
21890 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
218a0 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
218b0 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
218c0 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
218d0 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
218e0 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
218f0 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
21900 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
21910 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
21920 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
21930 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
21940 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
21950 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
21960 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21970 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
21980 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
21990 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
219a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
219b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
219c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
219d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
219e0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
219f0 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
21a00 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
21a10 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
21a20 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
21a30 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
21a40 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
21a50 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
21a60 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
21a70 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
21a80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
21aa0 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
21ab0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
21ac0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
21ad0 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
21ae0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
21af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21b00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
21b10 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
21b20 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
21b30 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
21b40 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
21b50 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
21b60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21b70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21b80 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
21b90 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
21ba0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21bb0 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
21bc0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
21bd0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
21be0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
21bf0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
21c00 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
21c10 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
21c20 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
21c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21c40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
21c50 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20  i64 iOffset;    
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21c70 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66  Byte offset of f
21c80 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
21c90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21ca0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21cb0 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
21cc0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
21cd0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
21ce0 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  >fd) );..  if( N
21cf0 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61  EVER(!isOpen(pPa
21d00 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20  ger->fd)) ){.   
21d10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21d20 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
21d30 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
21d40 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
21d50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65  ageSize);.    re
21d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21d70 20 20 7d 0a 20 20 69 4f 66 66 73 65 74 20 3d 20    }.  iOffset = 
21d80 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
21d90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
21da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21db0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
21dc0 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61   pPg->pData, pPa
21dd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
21de0 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  Offset);.  if( r
21df0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
21e00 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
21e10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
21e20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
21e30 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
21e40 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
21e50 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
21e60 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
21e70 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
21e80 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
21e90 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
21ea0 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
21eb0 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
21ec0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
21ed0 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
21ee0 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
21ef0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
21f00 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
21f10 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
21f20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2e 20 20        ** zero.  
21f30 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
21f40 20 33 35 2e 2e 33 39 20 73 68 6f 75 6c 64 20 62   35..39 should b
21f50 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
21f60 68 69 63 68 20 61 72 65 0a 20 20 20 20 20 20 2a  hich are.      *
21f70 2a 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  * never 0xffffff
21f80 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 20  ff.  So filling 
21f90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
21fa0 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
21fb0 66 66 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  ff.      ** byte
21fc0 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
21fd0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
21fe0 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
21ff0 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
22000 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
22010 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
22020 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
22030 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
22040 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
22050 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
22060 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
22070 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
22080 73 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36  sing equaling 16
22090 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
220a0 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
220b0 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
220c0 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
220d0 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
220e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
220f0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
22100 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
22110 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
22120 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
22130 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
22140 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
22150 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
22160 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
22170 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
22180 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
22190 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
221a0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
221b0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
221c0 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
221d0 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
221e0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20  LITE_NOMEM);..  
221f0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
22200 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
22210 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
22220 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
22230 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
22240 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
22250 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
22260 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
22270 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
22280 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
222a0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
222b0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
222c0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
222d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
222e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
222f0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
22300 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
22310 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
22320 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
22330 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
22340 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
22350 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
22360 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
22370 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
22380 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
22390 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
223a0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
223b0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
223c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
223d0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
223e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
223f0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
22400 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
22410 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
22420 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
22430 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
22440 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
22450 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
22460 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
22470 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
22480 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
22490 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
224a0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
224b0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
224c0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
224d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
224e0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
224f0 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
22500 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
22510 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
22520 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
22530 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
22540 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
22550 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
22560 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
22570 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
22580 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
22590 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
225a0 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
225b0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
225c0 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
225d0 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
225e0 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
225f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22600 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
22610 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
22620 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
22630 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
22640 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
22650 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
22660 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
22670 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
22680 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
22690 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
226a0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
226b0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
226c0 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
226d0 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
226e0 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
226f0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
22700 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
22710 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
22720 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
22730 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
22740 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
22750 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
22760 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
22770 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
22780 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   the operation d
22790 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20  escribed by (2) 
227a0 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74  above is not att
227b0 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74  empted, and if t
227c0 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  he.** pager is i
227d0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
227e0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
227f0 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69  TE_FULL when thi
22800 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  s is called,.** 
22810 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
22820 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
22830 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65  turned. It is pe
22840 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20  rmitted to read 
22850 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
22860 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46  when in SQLITE_F
22870 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e  ULL error state.
22880 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
22890 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
228a0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
228b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
228c0 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49  rned. If an.** I
228d0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
228e0 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
228f0 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
22900 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
22910 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72  urnal.** file or
22920 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
22930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
22940 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
22950 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
22960 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22970 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
22980 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
22990 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
229c0 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  /.  int isErrorR
229d0 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  eset = 0;       
229e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
229f0 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f  f recovering fro
22a00 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  m error state */
22a10 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
22a20 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
22a30 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61  ed from b-tree a
22a40 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  nd only when the
22a50 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f  re are no.  ** o
22a60 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
22a70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
22a80 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
22a90 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
22aa0 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28  che)==0 );.  if(
22ab0 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26 20   NEVER(MEMDB && 
22ac0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
22ad0 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67 65   ){ return pPage
22ae0 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20  r->errCode; }.. 
22af0 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
22b00 62 61 73 65 20 69 73 20 69 6e 20 61 6e 20 65 72  base is in an er
22b10 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
22b20 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  s a chance to cl
22b30 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
22b40 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
22b50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22b60 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
22b70 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e  rollback.  ** an
22b80 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e  y hot journal in
22b90 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
22ba0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
22bb0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
22bc0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
22bd0 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
22be0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
22bf0 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72  ){.      isError
22c00 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d  Reset = 1;.    }
22c10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
22c20 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  Code = SQLITE_OK
22c30 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
22c40 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
22c50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
22c60 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
22c70 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65  K || isErrorRese
22c80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
22c90 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
22ca0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
22cb0 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a  ;.    int isHotJ
22cc0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
22cd0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
22ce0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
22cf0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
22d00 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
22d10 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  che)==0 );.    i
22d20 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  f( pPager->noRea
22d30 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 61  dlock ){.      a
22d40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72  ssert( pPager->r
22d50 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 20  eadOnly );.     
22d60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
22d70 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
22d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22d90 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
22da0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
22db0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
22dc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22dd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22de0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22df0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
22e00 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
22e10 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
22e20 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
22e30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22e40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22e50 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
22e60 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  LOCK );..    /* 
22e70 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
22e80 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
22e90 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
22ea0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
22eb0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
22ec0 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
22ed0 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
22ee0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
22ef0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
22f00 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52     if( !isErrorR
22f10 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 61 73  eset ){.      as
22f20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
22f30 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41  ate <= PAGER_SHA
22f40 52 45 44 20 29 3b 0a 20 20 20 20 20 20 72 63 20  RED );.      rc 
22f50 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  = hasHotJournal(
22f60 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f  pPager, &isHotJo
22f70 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  urnal);.      if
22f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22f90 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
22fa0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
22fb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
22fc0 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73  ErrorReset || is
22fd0 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
22fe0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
22ff0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
23000 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23010 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
23020 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
23030 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
23040 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
23050 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
23060 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
23070 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
23080 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
23090 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
230a0 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
230b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
230c0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
230d0 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
230e0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
230f0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
23100 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
23110 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
23120 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
23130 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
23140 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
23150 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
23160 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
23170 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
23180 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
23190 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
231a0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
231b0 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
231c0 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
231d0 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
231e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
231f0 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
23200 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
23210 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
23220 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
23230 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
23240 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
23250 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
23260 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
23270 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
23280 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49  r->state<EXCLUSI
23290 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
232a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
232b0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
232c0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
232d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
232e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
232f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
23300 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
23310 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
23320 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23340 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
23350 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
23360 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
23370 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
23380 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
23390 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
233a0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
233b0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
233c0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
233d0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
233e0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
233f0 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
23400 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
23410 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
23420 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
23430 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
23440 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75  e.      ** OsTru
23450 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
23460 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
23470 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
23480 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
23490 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
234a0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
234b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
234c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
234d0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  fd) ){.        i
234e0 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
234f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
23500 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72  cess(pVfs,pPager
23510 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54  ->zJournal,SQLIT
23520 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
23530 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
23540 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
23560 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
23570 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
23580 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
23590 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
235a0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
235b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
235c0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
235d0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
235e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
235f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23600 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
23610 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
23620 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
23630 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
23640 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23650 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
23660 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
23670 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
23680 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23690 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
236a0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
236b0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
236c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
236d0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
236e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
236f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
23700 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
23710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23720 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23730 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
23740 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
23750 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75  ot exist, it usu
23760 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  ally means that 
23770 73 6f 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20  some .          
23780 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
23790 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
237a0 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
237b0 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
237c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
237d0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
237e0 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63  obtained the exc
237f0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76  lusive lock abov
23800 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20  e. Or, it .     
23810 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65         ** may me
23820 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
23830 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
23840 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
23850 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  is.            *
23860 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
23870 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f  alled and the jo
23880 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
23890 6e 6f 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a 20  not exist.  */. 
238a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
238b0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
238c0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
238d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
238e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
238f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23910 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
23920 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
23930 2a 20 54 4f 44 4f 3a 20 57 68 79 20 61 72 65 20  * TODO: Why are 
23940 74 68 65 73 65 20 63 6c 65 61 72 65 64 20 68 65  these cleared he
23950 72 65 3f 20 49 73 20 69 74 20 6e 65 63 65 73 73  re? Is it necess
23960 61 72 79 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50  ary? */.      pP
23970 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
23980 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
23990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
239a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
239b0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
239c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
239d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
239e0 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  0;. .      /* Pl
239f0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
23a00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
23a10 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
23a20 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
23a30 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
23a40 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
23a50 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
23a60 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
23a70 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
23a80 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
23a90 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
23aa0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
23ab0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
23ac0 73 74 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20  stent cache..   
23ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
23ae0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
23af0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fd) ){.        r
23b00 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
23b10 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
23b20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
23b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23b40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
23b50 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
23b60 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
23b70 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
23b80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
23b90 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
23ba0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
23bb0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
23bc0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
23bd0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
23be0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
23bf0 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
23c00 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
23c10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
23c20 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50  ckup || sqlite3P
23c30 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
23c40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
23c50 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
23c60 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
23c70 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
23c80 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
23c90 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
23ca0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
23cb0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
23cc0 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
23cd0 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
23ce0 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
23cf0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
23d00 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
23d10 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
23d20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
23d30 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
23d40 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
23d50 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
23d60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
23d70 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
23d80 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
23d90 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
23da0 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
23db0 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
23dc0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
23dd0 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
23de0 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
23df0 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
23e00 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
23e10 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
23e20 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
23e30 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
23e40 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
23e50 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
23e60 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
23e70 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
23e80 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
23e90 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
23ea0 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
23eb0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
23ec0 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
23ed0 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
23ee0 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
23ef0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
23f00 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
23f10 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
23f20 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
23f30 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
23f40 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
23f50 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
23f60 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
23f70 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
23f80 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
23f90 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
23fa0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
23fb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
23fc0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
23fd0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 0a  ager, &nPage);..
23fe0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
23ff0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
24000 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
24010 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
24020 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
24030 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
24040 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
24050 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
24060 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
24070 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
24080 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
24090 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
240a0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
240b0 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
240c0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
240d0 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
240e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
240f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24100 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
24110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
24130 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
24140 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
24150 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
24160 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
24170 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
24180 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
24190 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
241a0 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
241b0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
241c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
241d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
241e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
241f0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
24200 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
24210 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 7d  ER_SHARED );.  }
24220 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
24230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24240 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
24250 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
24260 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
24270 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
24280 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
24290 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
242a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
242b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
242c0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
242d0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
242e0 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
242f0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
24300 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
24310 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
24320 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
24330 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
24340 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
24350 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
24360 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
24370 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
24380 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
24390 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
243a0 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
243b0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
243c0 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
243d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
243e0 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
243f0 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
24400 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
24410 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
24420 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
24430 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
24440 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21  he)==0).   && (!
24450 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
24460 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
24470 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a  >journalOff>0) .
24480 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e    ){.    pagerUn
24490 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
244a0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
244b0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
244c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
244d0 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
244e0 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
244f0 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
24500 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
24510 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
24520 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
24530 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
24540 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
24550 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
24560 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
24570 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
24580 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
24590 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
245a0 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
245b0 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
245c0 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
245d0 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
245e0 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
245f0 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
24600 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
24610 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
24620 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
24630 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
24640 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
24650 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
24660 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
24670 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
24680 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
24690 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
246a0 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
246b0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
246c0 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
246d0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
246e0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
246f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
24700 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
24710 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
24720 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
24730 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
24740 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
24750 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
24760 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
24770 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
24780 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
24790 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
247a0 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
247b0 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
247c0 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
247d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
247e0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
247f0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
24800 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
24810 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
24820 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
24830 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
24840 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
24850 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
24860 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
24870 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
24880 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
24890 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
248a0 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
248b0 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
248c0 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
248d0 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
248e0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
248f0 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
24900 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
24910 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
24920 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
24930 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
24940 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
24950 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
24960 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
24970 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
24980 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
24990 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
249a0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
249b0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
249c0 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
249d0 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
249e0 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
249f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
24a00 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
24a10 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
24a20 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
24a30 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 77 69  e to populate wi
24a40 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
24a50 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
24a60 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
24a70 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
24a80 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
24a90 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
24aa0 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
24ab0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
24ac0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
24ad0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
24ae0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
24af0 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
24b00 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
24b10 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
24b20 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
24b30 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
24b40 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
24b50 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
24b60 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
24b70 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
24b80 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
24b90 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
24ba0 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
24bb0 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
24bc0 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
24bd0 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
24be0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
24bf0 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
24c00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24c10 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
24c20 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
24c30 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
24c40 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
24c50 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
24c60 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
24c70 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
24c80 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
24c90 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
24ca0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
24cb0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
24cc0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
24cd0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
24ce0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
24cf0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
24d00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
24d10 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
24d20 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
24d30 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
24d40 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
24d50 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
24d60 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
24d70 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
24d80 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
24d90 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
24da0 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
24db0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
24dc0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
24dd0 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
24de0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
24df0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
24e00 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
24e10 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
24e20 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
24e30 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
24e40 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
24e50 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
24e60 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
24e70 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
24e80 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
24e90 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
24ea0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
24eb0 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
24ec0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
24ed0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
24ee0 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
24ef0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
24f00 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
24f10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
24f20 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
24f30 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
24f40 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
24f50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
24f60 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
24f70 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
24f80 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
24f90 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
24fa0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
24fb0 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
24fc0 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
24fd0 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
24fe0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
24ff0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
25000 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25010 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f  state>PAGER_UNLO
25020 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  CK );..  if( pgn
25030 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
25040 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25050 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
25060 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
25070 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
25080 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
25090 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
250a0 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
250b0 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
250c0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
250d0 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
250e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
250f0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
25100 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
25110 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
25120 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
25130 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
25140 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
25150 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
25160 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
25170 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61  e, pgno, 1, ppPa
25180 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
25190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
251a0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
251b0 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
251c0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
251d0 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
251e0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
251f0 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
25200 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
25210 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
25220 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
25230 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
25240 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
25250 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
25260 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
25270 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
25280 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
25290 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
252a0 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
252b0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
252c0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
252d0 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
252e0 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
252f0 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
25300 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
25310 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
25320 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
25330 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
25340 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
25350 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
25360 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
25370 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
25380 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
25390 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
253a0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
253b0 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
253c0 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
253d0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
253e0 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
253f0 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
25400 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25410 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
25420 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
25430 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
25440 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
25450 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
25460 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
25470 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
25480 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a  .    int nMax;..
25490 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
254a0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
254b0 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
254c0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
254d0 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
254e0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
254f0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
25500 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
25510 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
25520 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
25530 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
25540 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
25550 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
25560 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
25570 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
25580 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
25590 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
255a0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
255b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
255c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
255d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
255e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
255f0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
25600 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
25610 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
25620 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
25630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25640 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
25650 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
25660 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
25670 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67   || nMax<(int)pg
25680 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
25690 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
256a0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
256b0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
256c0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 09 72 63 20 3d  >mxPgno ){..rc =
256d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 09 67   SQLITE_FULL;..g
256e0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
256f0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
25700 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
25710 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
25720 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
25730 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
25740 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
25750 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
25760 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
25770 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
25780 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
25790 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
257a0 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
257b0 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
257c0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
257d0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
257e0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
257f0 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
25800 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
25810 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
25820 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
25830 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
25840 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
25850 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
25860 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
25870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25880 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
25890 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
258a0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
258b0 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
258c0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
258d0 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
258e0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
258f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
25900 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
25910 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
25920 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
25930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
25940 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
25950 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
25960 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
25970 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
25980 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
25990 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
259a0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
259b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
259c0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
259d0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
259e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
259f0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
25a00 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
25a10 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
25a20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25a30 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
25a40 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
25a50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
25a60 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
25a70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25a90 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
25aa0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
25ab0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
25ac0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
25ad0 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
25ae0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
25af0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
25b00 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
25b10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
25b20 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
25b30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
25b40 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
25b50 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
25b60 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
25b70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
25b80 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
25b90 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
25ba0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
25bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
25bc0 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
25bd0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
25be0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
25bf0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
25c00 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
25c10 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
25c20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
25c30 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
25c40 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
25c50 20 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c   in cache. Also,
25c60 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
25c70 20 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e   .** pager is in
25c80 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
25c90 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
25ca0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
25cb0 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70  ,.** or if the p
25cc0 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
25cd0 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
25ce0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
25cf0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
25d00 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
25d10 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
25d20 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
25d30 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
25d40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
25d50 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
25d60 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
25d70 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
25d80 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
25d90 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
25da0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
25db0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
25dc0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
25dd0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
25de0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
25df0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
25e00 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
25e10 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
25e20 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
25e30 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
25e40 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
25e50 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
25e60 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
25e70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
25e80 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
25e90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25ea0 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
25eb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25ec0 72 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52  r->state > PAGER
25ed0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c  _UNLOCK );.  sql
25ee0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
25ef0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
25f00 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
25f10 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
25f20 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
25f30 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
25f40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
25f50 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
25f60 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
25f70 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
25f80 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
25f90 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
25fa0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
25fb0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
25fc0 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
25fd0 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
25fe0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
25ff0 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
26000 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
26010 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
26020 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
26030 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
26040 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
26050 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
26060 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
26070 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
26080 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
26090 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
260a0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
260b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
260c0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
260d0 20 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64   file has alread
260e0 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65  y been opened, e
260f0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a  nsure that the.*
26100 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
26110 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20  le is open too. 
26120 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
26130 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  nal is not open,
26140 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
26150 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
26160 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
26170 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
26180 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
26190 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
261a0 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f  .** An SQLITE_IO
261b0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
261c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
261d0 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20  f a call to .** 
261e0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
261f0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
26200 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
26210 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
26220 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
26230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
26240 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26250 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
26260 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
26270 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
26280 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
26290 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
262a0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
262b0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
262c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
262d0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
262e0 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
262f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
26300 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
26310 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
26320 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
26330 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
26340 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
26350 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
26360 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26370 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74  called at the st
26380 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69  art of every wri
26390 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
263a0 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c  ** There must al
263b0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
263c0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
263d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
263e0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77  abase .** file w
263f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
26400 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
26410 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
26420 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
26430 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69  r pPager and wri
26440 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  te a journal hea
26450 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  der.** to the st
26460 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68  art of it. If th
26470 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
26480 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20  avepoints, open 
26490 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
264a0 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73  ** as well. This
264b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
264c0 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  y used when the 
264d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
264e0 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64  being .** opened
264f0 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c   to write a roll
26500 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74  back log for a t
26510 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69  ransaction. It i
26520 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77  s not used .** w
26530 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f  hen opening a ho
26540 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  t journal file t
26550 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a  o roll it back..
26560 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
26570 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72  rnal file is alr
26580 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74  eady open (as it
26590 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75   may be in exclu
265a0 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74  sive mode),.** t
265b0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
265c0 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20  n just writes a 
265d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
265e0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
265f0 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70  he.** already op
26600 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  en file. .**.** 
26610 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  Whether or not t
26620 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26630 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69  is opened by thi
26640 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a  s function, the.
26650 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
26660 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63  nal bitvec struc
26670 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
26680 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
26690 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
266a0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
266b0 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65  ssful. Otherwise
266c0 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
266d0 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65  ITE_NOMEM if the
266e0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f   attempt to allo
266f0 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f  cate Pager.pInJo
26700 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
26710 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  .** an IO error 
26720 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  code if opening 
26730 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  or writing the j
26740 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c  ournal file fail
26750 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
26760 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
26770 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
26780 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
26790 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
267c0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
26800 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  ase file */.  sq
26810 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
26820 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
26830 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
26840 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
26850 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
26860 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
26870 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
26880 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
26890 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
268a0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
268b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
268c0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
268d0 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20  ALMODE_OFF );.  
268e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
268f0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
26900 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
26910 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
26920 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
26930 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26940 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
26950 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
26960 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
26970 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
26980 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
26990 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
269a0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
269b0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
269c0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
269d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
269e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
269f0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
26a00 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
26a10 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
26a20 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
26a30 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
26a40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
26a50 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
26a60 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
26a70 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20  reate(nPage);.  
26a80 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
26a90 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
26aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26ab0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
26ac0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
26ad0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
26ae0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
26af0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
26b00 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
26b10 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
26b20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
26b30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26b40 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
26b50 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
26b60 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
26b70 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
26b80 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
26b90 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
26ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
26bb0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
26bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
26bd0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
26be0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
26bf0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
26c00 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
26c10 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
26c20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
26c30 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
26c40 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
26c50 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20  EMP_JOURNAL):.  
26c60 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
26c70 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
26c80 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69  L).        );.#i
26c90 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
26ca0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
26cb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26cc0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
26cd0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
26ce0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26cf0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
26d00 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
26d10 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
26d20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
26d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
26d40 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
26d50 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
26d60 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
26d70 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
26d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
26d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
26da0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26db0 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ) );.  }...  /* 
26dc0 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
26dd0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
26de0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
26df0 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a  le and open .  *
26e00 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
26e10 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
26e20 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
26e30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26e40 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
26e50 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
26e60 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
26e70 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ed. */.    pPage
26e80 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
26e90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
26ea0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26eb0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
26ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
26ed0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
26ee0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
26ef0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26f00 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
26f10 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
26f20 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  r = 0;.    pPage
26f30 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
26f40 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  0;.    rc = writ
26f50 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
26f60 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
26f70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26f80 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
26f90 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nt ){.    rc = o
26fa0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
26fb0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
26fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26fd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
26fe0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
26ff0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
27000 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
27010 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
27020 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27030 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
27040 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
27050 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
27060 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
27070 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
27080 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
27090 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
270a0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
270b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
270c0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
270d0 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
270e0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
270f0 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
27100 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
27110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27120 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
27130 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
27140 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
27150 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
27160 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
27170 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
27180 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
27190 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
271a0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
271b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
271c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
271d0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61  in-memory file a
271e0 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nd, the journal 
271f0 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e  file is .** open
27200 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
27210 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46   been already. F
27220 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  or a temporary f
27230 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  ile, the opening
27240 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72   .** of the jour
27250 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
27260 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
27270 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65   is an actual ne
27280 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20  ed to .** write 
27290 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
272a0 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65  TODO: Why handle
272b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
272c0 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a   differently?.**
272d0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
272e0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
272f0 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61  d (or if it is a
27300 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68  lready open), th
27310 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  en a.** journal-
27320 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
27330 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  n to the start o
27340 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  f it..**.** If t
27350 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
27360 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
27370 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
27380 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
27390 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
273a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
273b0 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
273c0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
273d0 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
273e0 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
273f0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
27400 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
27410 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
27420 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
27430 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
27440 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
27450 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
27460 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
27470 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
27480 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
27490 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
274a0 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
274b0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
274c0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
274d0 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
274e0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
274f0 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
27500 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
27510 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
27520 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
27530 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
27540 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
27550 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
27560 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
27570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27580 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27590 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
275a0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67  UNLOCK );.  pPag
275b0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
275c0 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
275d0 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ory;.  if( pPage
275e0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
275f0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
27600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
27610 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
27620 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
27630 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  B && !pPager->te
27640 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f  mpFile );..    /
27650 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
27660 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
27670 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
27680 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
27690 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73  ameter.    ** is
276a0 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
276b0 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
276c0 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
276d0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
276e0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
276f0 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
27700 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
27710 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
27720 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c  CLUSIVE.    ** l
27730 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
27740 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
27750 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
27760 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
27770 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
27780 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
27790 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
277a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
277b0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
277c0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
277d0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66  SERVED;.      if
277e0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
277f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
27800 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
27810 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
27820 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
27830 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65   }..    /* No ne
27840 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  ed to open the j
27850 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
27860 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69  his time.  It wi
27870 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65  ll be.    ** ope
27880 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73  ned before it is
27890 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66   written to.  If
278a0 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e   we defer openin
278b0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20  g the journal,. 
278c0 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73     ** we might s
278d0 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  ave the work of 
278e0 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20  creating a file 
278f0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
27900 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75  on.    ** ends u
27910 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e  p being a no-op.
27920 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  .    */.  }else 
27930 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
27940 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
27950 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
27960 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
27970 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
27980 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
27990 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
279a0 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20  ode the last.   
279b0 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
279c0 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
279d0 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
279e0 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
279f0 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
27a00 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
27a10 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
27a20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27a30 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
27a40 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65   kept open and e
27a50 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61  ither was trunca
27a60 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f  ted to 0 bytes o
27a70 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73  r its header was
27a80 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74  .    ** overwrit
27a90 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ten with zeros..
27aa0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
27ab0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  t( pPager->nRec=
27ac0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
27ad0 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
27ae0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
27af0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
27b00 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
27b10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
27b20 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
27b30 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  er);.  }..  PAGE
27b40 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
27b50 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
27b60 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
27b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27b80 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
27b90 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  ( !pPager->dbMod
27ba0 69 66 69 65 64 20 29 3b 0a 20 20 20 20 2f 2a 20  ified );.    /* 
27bb0 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72  Ignore any IO er
27bc0 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73 20  ror that occurs 
27bd0 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65 6e 64  within pager_end
27be0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e 20  _transaction(). 
27bf0 54 68 65 0a 20 20 20 20 2a 2a 20 70 75 72 70 6f  The.    ** purpo
27c00 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 20  se of this call 
27c10 69 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  is to reset the 
27c20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
27c30 66 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  f the pager.    
27c40 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e 20 49  ** sub-system. I
27c50 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  t doesn't matter
27c60 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
27c70 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72 6f 70  file is not prop
27c80 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69 6e 61  erly.    ** fina
27c90 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20 70 6f  lized at this po
27ca0 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20 69 73  int (since it is
27cb0 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a 6f 75   not a valid jou
27cc0 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77 61 79  rnal file anyway
27cd0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 61  )..    */.    pa
27ce0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
27cf0 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ion(pPager, 0);.
27d00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
27d20 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67   single data pag
27d30 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
27d40 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
27d50 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
27d60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72   main journal or
27d70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20   sub-journal as 
27d80 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65  required. If the
27d90 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
27da0 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20   into.** one of 
27db0 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  the journals, th
27dc0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
27dd0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
27de0 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  e .** Pager.pInJ
27df0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e  ournal bitvec an
27e00 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
27e10 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
27e20 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20  t bitvecs.** of 
27e30 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  any open savepoi
27e40 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61  nts as appropria
27e50 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
27e60 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
27e70 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
27e80 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
27e90 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  pData;.  Pager *
27ea0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
27eb0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
27ec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
27ed0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
27ee0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c  s not called unl
27ef0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
27f00 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
27f10 65 6e 0a 20 20 2a 2a 20 73 74 61 72 74 65 64 2e  en.  ** started.
27f20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27f30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
27f40 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
27f50 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
27f60 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76  or has been prev
27f70 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c  iously detected,
27f80 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65   report the same
27f90 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69   error.  ** agai
27fa0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
27fb0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
27fc0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
27fd0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
27fe0 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
27ff0 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
28000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
28010 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
28020 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
28030 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
28040 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
28050 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
28060 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
28070 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
28080 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
28090 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
280a0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
280b0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
280c0 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
280d0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
280e0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
280f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
28100 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
28110 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
28120 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
28130 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
28140 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
28150 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
28160 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
28170 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
28180 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
28190 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
281a0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
281b0 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
281c0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
281d0 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
281e0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
281f0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
28200 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
28210 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
28220 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
28230 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
28240 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
28250 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65   **.    ** Highe
28260 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73  r level routines
28270 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
28280 65 61 64 79 20 73 74 61 72 74 65 64 20 61 20 74  eady started a t
28290 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20  ransaction,.    
282a0 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ** which means t
282b0 68 65 79 20 68 61 76 65 20 61 63 71 75 69 72 65  hey have acquire
282c0 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  d the necessary 
282d0 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72 6f  locks but the ro
282e0 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f  llback.    ** jo
282f0 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
28300 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 20  yet be open..   
28310 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
28320 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
28330 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72  Pager, 0, pPager
28340 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b  ->subjInMemory);
28350 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
28360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28370 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
28380 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
28390 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
283a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
283b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
283c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
283d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
283e0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
283f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
28400 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
28410 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28430 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
28440 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
28450 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
28460 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
28470 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
28480 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
28490 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
284a0 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
284b0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
284c0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
284d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
284e0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
284f0 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
28500 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
28510 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
28520 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
28530 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28540 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28   !pageInJournal(
28550 70 50 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70  pPg) && isOpen(p
28560 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
28570 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
28580 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
28590 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
285a0 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
285b0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
285c0 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  2;..        /* W
285d0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
285e0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
285f0 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
28600 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
28610 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
28620 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
28630 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
28640 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
28650 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
28660 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
28670 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
28680 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
28690 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
286a0 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
286b0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
286c0 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
286d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
286e0 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
286f0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
28700 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
28710 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
28720 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
28730 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
28740 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28750 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  lOff, pPg->pgno)
28760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28780 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28790 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
287a0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
287b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
287c0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
287f0 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20  lOff + 4);.     
28800 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28810 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
28820 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20  r->pageSize+4;. 
28830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
28860 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
28870 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
28880 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28890 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20  , cksum);.      
288a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
288b0 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
288c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49       }.        I
288d0 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
288e0 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
288f0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
28900 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
28910 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
28920 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  rnalOff, pPager-
28930 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20  >pageSize));.   
28940 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
28950 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
28960 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  itej_count);.   
28970 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
28980 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
28990 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
289a0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
289c0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
289d0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
289e0 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
289f0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
28a00 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72  YNC)?1:0), pager
28a10 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
28a20 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
28a30 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
28a40 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
28a50 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75  curred while jou
28a60 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20  rnalling the.   
28a70 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
28a80 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c  the block above,
28a90 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79   set the need-sy
28aa0 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20  nc flag for the 
28ab0 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  page..        **
28ac0 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e   Otherwise, when
28ad0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
28ae0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
28af0 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20   the logic in.  
28b00 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63        ** playbac
28b10 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
28b20 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
28b30 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
28b40 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20  e restored.     
28b50 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74     ** in the dat
28b60 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20  abase file. And 
28b70 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
28b80 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e  ccurs while doin
28b90 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a  g so,.        **
28ba0 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
28bb0 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20   may follow..   
28bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28bd0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
28be0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
28bf0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
28c00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
28c10 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
28c20 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
28c30 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
28c40 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68     /* An error h
28c50 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69 74  as occurred writ
28c60 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
28c70 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
28c80 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
28c90 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
28ca0 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
28cb0 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
28cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28cd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28ce0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
28cf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28d00 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61    }..        pPa
28d10 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
28d20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
28d30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
28d40 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
28d50 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
28d60 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
28d70 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
28d80 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
28d90 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
28da0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
28db0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
28dc0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
28dd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
28de0 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64         rc |= add
28df0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
28e00 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
28e10 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
28e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
28e40 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
28e50 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
28e60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
28e90 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
28ea0 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
28eb0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
28ec0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
28ed0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
28ee0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
28ef0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
28f00 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
28f10 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
28f20 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25  TRACE(("APPEND %
28f30 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
28f40 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
28f50 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
28f60 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
28f70 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
28f80 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
28f90 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
28fa0 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20  C)?1:0)));.     
28fb0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
28fc0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
28fd0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
28fe0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
28ff0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
29000 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
29010 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
29020 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
29030 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
29040 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
29050 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
29060 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
29070 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
29080 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
29090 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
290a0 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
290b0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
290c0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
290d0 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65 71  .    if( subjReq
290e0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
290f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
29100 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
29110 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
29120 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
29130 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
29140 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
29150 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
29160 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
29170 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
29180 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70  r->dbSize<pPg->p
29190 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
291a0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
291b0 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  >pgno;.  }.  ret
291c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
291d0 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
291e0 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
291f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
29200 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
29210 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68  re .** making ch
29220 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
29230 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
29240 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72   check the retur
29250 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74  n value .** of t
29260 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
29270 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
29280 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  to change any pa
29290 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a  ge data unless .
292a0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
292b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
292c0 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  K..**.** The dif
292d0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
292e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
292f0 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
29300 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
29310 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
29320 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
29330 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
29340 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
29350 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
29360 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
29370 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
29380 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
29390 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
293a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
293b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
293c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
293d0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
293e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
293f0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
29400 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
29410 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20   returned.** as 
29420 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68  appropriate. Oth
29430 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
29440 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
29450 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
29460 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
29470 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29480 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
29490 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
294a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
294b0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
294c0 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
294d0 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
294e0 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
294f0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66  pageSize);..  if
29500 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
29510 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
29520 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
29530 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
29540 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
29550 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29560 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29580 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
29590 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
295a0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
295b0 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
295d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
295e0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
295f0 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
29600 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29620 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
29630 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  .    int needSyn
29640 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  c = 0;         /
29650 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
29660 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
29670 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f  D_SYNC */..    /
29680 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
29690 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
296a0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
296b0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
296c0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
296d0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
296e0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
296f0 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
29700 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
29710 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
29720 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
29730 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29740 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
29750 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
29760 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
29770 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
29780 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
29790 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
297a0 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
297b0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
297c0 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
297d0 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
297e0 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
297f0 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
29800 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
29810 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
29820 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
29830 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
29840 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
29850 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
29860 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
29870 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ..    sqlite3Pag
29880 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
29890 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67  er, (int *)&nPag
298a0 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28  eCount);.    if(
298b0 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
298c0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
298d0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
298e0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
298f0 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
29900 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
29910 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
29920 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
29930 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
29940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29950 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
29960 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
29970 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
29980 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
29990 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
299a0 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
299b0 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
299c0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
299d0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
299e0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
299f0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
29a00 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
29a10 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
29a20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
29a30 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
29a40 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
29a50 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
29a60 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
29a70 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
29a80 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
29a90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
29aa0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
29ab0 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
29ac0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
29ad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29af0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
29b00 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
29b10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
29b20 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
29b30 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
29b40 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
29b50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
29b60 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
29b70 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
29b80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
29ba0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
29bb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
29bd0 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
29be0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
29bf0 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
29c00 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29c10 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
29c20 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
29c30 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
29c40 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
29c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
29c60 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
29c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
29c80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48     /* If the PGH
29c90 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
29ca0 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
29cb0 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
29cc0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
29cd0 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
29ce0 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
29cf0 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
29d00 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
29d10 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
29d20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
29d30 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
29d40 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
29d50 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
29d60 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
29d70 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
29d80 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
29d90 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
29da0 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
29db0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
29dc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29dd0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
29de0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29df0 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20  _OK && needSync 
29e00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29e10 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
29e20 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
29e30 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
29e40 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  ii<nPage; ii++){
29e50 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
29e60 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
29e70 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
29e80 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
29e90 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
29ea0 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
29eb0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
29ec0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
29ed0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29ee0 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
29ef0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29f00 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
29f10 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
29f20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
29f30 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
29f40 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
29f50 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
29f60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29f70 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
29f80 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
29f90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29fa0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
29fb0 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
29fc0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
29fd0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
29fe0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
29ff0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a000 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
2a010 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
2a020 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
2a030 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
2a040 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2a050 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
2a060 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
2a070 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a080 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
2a090 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
2a0a0 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
2a0b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
2a0c0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
2a0d0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
2a0e0 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
2a0f0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2a100 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
2a110 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
2a120 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
2a130 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
2a140 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
2a150 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
2a160 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69  d as dirty.  Thi
2a170 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
2a180 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20  xample, when.** 
2a190 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
2a1a0 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61  n added as a lea
2a1b0 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
2a1c0 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20  t and so its.** 
2a1d0 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65  content no longe
2a1e0 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  r matters..**.**
2a1f0 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
2a200 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
2a210 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
2a220 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
2a230 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
2a240 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
2a250 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20  used. The pager 
2a260 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
2a270 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
2a280 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
2a290 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
2a2a0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
2a2b0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
2a2c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
2a2d0 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
2a2e0 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a  eed of large .**
2a2f0 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
2a300 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
2a310 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2a320 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2a330 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2a340 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2a350 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
2a360 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
2a370 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2a380 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47  nt==0 ){.    PAG
2a390 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57  ERTRACE(("DONT_W
2a3a0 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
2a3b0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
2a3c0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2a3d0 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  )));.    IOTRACE
2a3e0 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
2a3f0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
2a400 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e  pgno)).    pPg->
2a410 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
2a420 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
2a430 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
2a440 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
2a450 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
2a460 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
2a470 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2a480 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2a490 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
2a4a0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
2a4b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2a4c0 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d  file .** change-
2a4d0 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20  counter, stored 
2a4e0 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d  as a 4-byte big-
2a4f0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73  endian integer s
2a500 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62  tarting at .** b
2a510 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66  yte offset 24 of
2a520 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2a530 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
2a540 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20  DirectMode flag 
2a550 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
2a560 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61  is is done by ca
2a570 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65  lling .** sqlite
2a580 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
2a590 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f   page 1, then mo
2a5a0 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
2a5b0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  ents of the.** p
2a5c0 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69  age data. In thi
2a5d0 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20  s case the file 
2a5e0 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20  will be updated 
2a5f0 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
2a600 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2a610 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
2a620 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74  .** The isDirect
2a630 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e  Mode flag may on
2a640 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ly be non-zero i
2a650 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  f the library wa
2a660 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69  s compiled.** wi
2a670 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  th the SQLITE_EN
2a680 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2a690 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  E macro defined.
2a6a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
2a6b0 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73  * if isDirect is
2a6c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2a6d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a6e0 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72  e is updated dir
2a6f0 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74  ectly.** by writ
2a700 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76  ing an updated v
2a710 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
2a720 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
2a730 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
2a740 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  OsWrite() functi
2a750 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
2a760 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
2a770 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
2a780 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
2a790 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69  DirectMode){.  i
2a7a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a7b0 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  K;..  /* Declare
2a7c0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2a7d0 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
2a7e0 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
2a7f0 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
2a800 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2a810 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
2a820 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
2a830 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
2a840 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
2a850 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
2a860 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
2a870 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
2a880 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
2a890 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
2a8a0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
2a8b0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
2a8c0 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
2a8d0 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
2a8e0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2a8f0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
2a900 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
2a910 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
2a920 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
2a930 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
2a940 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
2a950 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
2a960 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
2a970 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
2a980 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
2a990 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
2a9a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2a9b0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2a9c0 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44  WRITE.# define D
2a9d0 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61  IRECT_MODE 0.  a
2a9e0 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d  ssert( isDirectM
2a9f0 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53  ode==0 );.  UNUS
2aa00 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44  ED_PARAMETER(isD
2aa10 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73  irectMode);.#els
2aa20 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43  e.# define DIREC
2aa30 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d  T_MODE isDirectM
2aa40 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  ode.#endif..  as
2aa50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2aa60 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2aa70 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50  VED );.  if( !pP
2aa80 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2aa90 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d  tDone && pPager-
2aaa0 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
2aab0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20   PgHdr *pPgHdr; 
2aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aad0 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70  * Reference to p
2aae0 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32  age 1 */.    u32
2aaf0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
2ab00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ab10 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63  itial value of c
2ab20 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
2ab30 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  eld */..    asse
2ab40 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
2ab50 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28  pFile && isOpen(
2ab60 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
2ab70 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
2ab80 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
2ab90 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
2aba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2abb0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2abc0 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
2abd0 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d   assert( pPgHdr=
2abe0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
2abf0 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  _OK );..    /* I
2ac00 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66  f page one was f
2ac10 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75  etched successfu
2ac20 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75  lly, and this fu
2ac30 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  nction is not.  
2ac40 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69    ** operating i
2ac50 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d  n direct-mode, m
2ac60 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61  ake page 1 writa
2ac70 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20 69  ble.  When not i
2ac80 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  n .    ** direct
2ac90 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69 73   mode, page 1 is
2aca0 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e 20   always held in 
2acb0 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65 20  cache and hence 
2acc0 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a 20  the PagerGet(). 
2acd0 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 61     ** above is a
2ace0 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75 6c  lways successful
2acf0 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c 57   - hence the ALW
2ad00 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49 54  AYS on rc==SQLIT
2ad10 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  E_OK..    */.   
2ad20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f 44   if( !DIRECT_MOD
2ad30 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d 3d  E && ALWAYS(rc==
2ad40 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20  SQLITE_OK) ){.  
2ad50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ad60 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
2ad70 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
2ad80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ad90 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63   ){.      /* Inc
2ada0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2adb0 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
2adc0 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
2add0 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
2ade0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2adf0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
2ae00 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
2ae10 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
2ae20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2ae30 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32  r++;.      put32
2ae40 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2ae50 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
2ae60 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
2ae70 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20  ..      /* Also 
2ae80 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65  store the SQLite
2ae90 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
2aea0 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20  in bytes 96..99 
2aeb0 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  */.      put32bi
2aec0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2aed0 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51  r->pData)+96, SQ
2aee0 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
2aef0 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  BER);..      /* 
2af00 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69  If running in di
2af10 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65  rect mode, write
2af20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2af30 20 70 61 67 65 20 31 20 74 6f 20 74 68 65 20 66   page 1 to the f
2af40 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ile. */.      if
2af50 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 29 7b  ( DIRECT_MODE ){
2af60 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
2af70 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48  oid *zBuf = pPgH
2af80 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  dr->pData;.     
2af90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2afa0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
2afb0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2afc0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2afd0 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
2afe0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2aff0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2b000 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b010 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2b020 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2b030 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2b040 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2b050 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2b060 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2b070 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
2b080 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
2b090 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
2b0a0 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
2b0b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2b0c0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20  f(pPgHdr);.  }. 
2b0d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b0e0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
2b0f0 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
2b100 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
2b110 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
2b120 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  files.** or page
2b130 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
2b140 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
2b150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
2b160 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64  ssful, or called
2b170 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20   on a pager for 
2b180 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f  which it is a no
2b190 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  -op, this.** fun
2b1a0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2b1b0 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
2b1c0 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  se, an IO error 
2b1d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2b1e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b1f0 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
2b200 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2b210 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2b240 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  */.  assert( !ME
2b250 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
2b260 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
2b270 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b280 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2b290 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
2b2a0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
2b2b0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
2b2c0 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
2b2d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
2b2e0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
2b2f0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
2b300 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
2b310 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
2b320 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
2b330 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2b340 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
2b350 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
2b360 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
2b370 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
2b380 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
2b390 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
2b3a0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
2b3b0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
2b3c0 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
2b3d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
2b3e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2b3f0 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
2b400 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2b410 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2b420 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
2b430 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20  updated,.**   * 
2b440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
2b450 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68  ynced (unless th
2b460 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
2b470 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
2b480 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c  sed),.**   * all
2b490 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65   dirty pages are
2b4a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2b4b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a  database file, .
2b4c0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
2b4d0 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ase file is trun
2b4e0 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72  cated (if requir
2b4f0 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ed), and.**   * 
2b500 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b510 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  e synced. .**.**
2b520 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
2b530 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
2b540 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2b550 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e  action is to fin
2b560 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74  alize .** (delet
2b570 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  e, truncate or z
2b580 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61  ero the first pa
2b590 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e  rt of) the journ
2b5a0 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20  al file (or .** 
2b5b0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
2b5c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
2b5d0 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
2b5e0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
2b5f0 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
2b600 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
2b610 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
2b620 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
2b630 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
2b640 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2b650 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
2b660 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
2b670 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
2b680 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
2b690 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2b6a0 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
2b6b0 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
2b6c0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
2b6d0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
2b6e0 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
2b6f0 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
2b700 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
2b710 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
2b720 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
2b730 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
2b740 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
2b750 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
2b760 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2b770 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
2b780 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
2b790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b7a0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
2b7b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
2b7c0 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ster,           
2b7d0 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
2b7e0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2b7f0 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nal name */.  in
2b800 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20  t noSync        
2b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b820 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68   True to omit th
2b830 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64  e xSync on the d
2b840 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  b file */.){.  i
2b850 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b860 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2b870 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2b880 0a 0a 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69  ..  /* The dbOri
2b890 67 53 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73  gSize is never s
2b8a0 65 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  et if journal_mo
2b8b0 64 65 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65  de=OFF */.  asse
2b8c0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2b8d0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2b8e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
2b8f0 7c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  | pPager->dbOrig
2b900 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Size==0 );..  /*
2b910 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   If a prior erro
2b920 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f  r occurred, repo
2b930 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67  rt that error ag
2b940 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ain. */.  if( pP
2b950 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
2b960 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
2b970 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52  rrCode;..  PAGER
2b980 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
2b990 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
2b9a0 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
2b9b0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
2b9c0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2b9d0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
2b9e0 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69  ->dbSize));..  i
2b9f0 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
2ba00 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2ba10 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
2ba20 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2ba30 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
2ba40 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2ba50 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
2ba60 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68     ** function h
2ba70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2ba80 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f  called, it is mo
2ba90 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48  stly a no-op.  H
2baa0 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20  owever, any.    
2bab0 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f  ** backup in pro
2bac0 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62  gress needs to b
2bad0 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20  e restarted..   
2bae0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
2baf0 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
2bb00 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
2bb10 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
2bb20 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
2bb30 53 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72  SYNCED && pPager
2bb40 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2bb50 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
2bb60 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61  owing block upda
2bb70 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
2bb80 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20  ounter. Exactly 
2bb90 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  how it.    ** do
2bba0 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
2bbb0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
2bbc0 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
2bbd0 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2bbe0 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62  .    ** was enab
2bbf0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2bc00 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
2bc10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
2bc20 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  ts the .    ** r
2bc30 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
2bc40 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
2bc50 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20  tion: .    **.  
2bc60 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69    **    * The fi
2bc70 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2bc80 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
2bc90 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
2bca0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
2bcb0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
2bcc0 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
2bcd0 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d  **    * This com
2bce0 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
2bcf0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
2bd00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
2bd10 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61  .    **    * Exa
2bd20 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
2bd30 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
2bd40 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
2bd50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2bd60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2bd70 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2bd80 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
2bd90 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2bda0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
2bdb0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
2bdc0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
2bdd0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2bde0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2bdf0 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e  ange.    ** coun
2be00 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74  ter in 'indirect
2be10 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f  -mode'. If the o
2be20 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63  ptimization is c
2be30 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20  ompiled in but. 
2be40 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70     ** is not app
2be50 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20  licable to this 
2be60 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c  transaction, cal
2be70 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  l sqlite3Journal
2be80 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20  Create().    ** 
2be90 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
2bea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2beb0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
2bec0 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
2bed0 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  ll.    ** pager_
2bee0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2bef0 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2bf00 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2bf10 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20  r in indirect.  
2bf20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20    ** mode. .    
2bf30 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  **.    ** Otherw
2bf40 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
2bf50 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
2bf60 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
2bf70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  licable,.    ** 
2bf80 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
2bf90 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2bfa0 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2bfb0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2bfc0 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72  r.    ** in 'dir
2bfd0 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68  ect' mode. In th
2bfe0 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2bff0 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
2c000 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  ver be.    ** cr
2c010 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
2c020 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
2c030 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2c040 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2c050 52 49 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a  RITE.    PgHdr *
2c060 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
2c070 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2c080 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2c090 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2c0a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2c0b0 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  FF );.    if( !z
2c0c0 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e  Master && isOpen
2c0d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
2c0e0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
2c0f0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
2c100 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
2c110 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ) .     && pPage
2c120 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65  r->dbSize>=pPage
2c130 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  r->dbFileSize.  
2c140 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d     && (0==(pPg =
2c150 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2c160 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2c170 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d  pPCache)) || 0==
2c180 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20  pPg->pDirty).   
2c190 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
2c1a0 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
2c1b0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76  change counter v
2c1c0 69 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72  ia the direct-wr
2c1d0 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  ite method. The 
2c1e0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  .      ** follow
2c1f0 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
2c200 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  dify the in-memo
2c210 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
2c220 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20  n of page 1 .   
2c230 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65     ** to include
2c240 20 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61   the updated cha
2c250 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20  nge counter and 
2c260 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20  then write page 
2c270 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65  1 .      ** dire
2c280 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
2c290 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75  base file. Becau
2c2a0 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63  se of the atomic
2c2b0 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a  -write .      **
2c2c0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
2c2d0 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
2c2e0 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  m, this is safe.
2c2f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c300 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
2c310 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
2c320 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65  ager, 1);.    }e
2c330 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2c340 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
2c350 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
2c360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2c370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c380 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2c390 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2c3a0 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
2c3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2c3c0 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67  lse.    rc = pag
2c3d0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2c3e0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2c3f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
2c400 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c410 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2c420 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20  se_one_exit;..  
2c430 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
2c440 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
2c450 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
2c460 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
2c470 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65   pages.    ** be
2c480 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
2c490 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
2c4a0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
2c4b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
2c4c0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73     ** file. This
2c4d0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2c4e0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2c4f0 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mode..    **.   
2c500 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69   ** Before readi
2c510 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74  ng the pages wit
2c520 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c  h page numbers l
2c530 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
2c540 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76      ** current v
2c550 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
2c560 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65  Size, set dbSize
2c570 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
2c580 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  ue.    ** that i
2c590 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74  t took at the st
2c5a0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
2c5b0 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  action. Otherwis
2c5c0 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  e, the.    ** ca
2c5d0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2c5e0 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20  gerGet() return 
2c5f0 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73  zeroed pages ins
2c600 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20  tead of .    ** 
2c610 72 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f  reading data fro
2c620 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2c630 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
2c640 2a 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f  ** When journal_
2c650 6d 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62  mode==OFF the db
2c660 4f 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61  OrigSize is alwa
2c670 79 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73  ys zero, so this
2c680 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65  .    ** block ne
2c690 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72  ver runs if jour
2c6a0 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20  nal_mode=OFF..  
2c6b0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2c6c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2c6d0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2c6e0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
2c6f0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
2c700 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 50      && ALWAYS(pP
2c710 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2c720 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2c730 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 29 7b  MODE_OFF).    ){
2c740 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20  .      Pgno i;  
2c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c770 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2c780 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63  iable */.      c
2c790 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20  onst Pgno iSkip 
2c7a0 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
2c7b0 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64  pPager); /* Pend
2c7c0 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f  ing lock page */
2c7d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e  .      const Pgn
2c7e0 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  o dbSize = pPage
2c7f0 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20  r->dbSize;      
2c800 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61   /* Database ima
2c810 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20  ge size */ .    
2c820 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2c830 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   = pPager->dbOri
2c840 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72  gSize;.      for
2c850 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c  ( i=dbSize+1; i<
2c860 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
2c870 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
2c880 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
2c890 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
2c8a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
2c8b0 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
2c8c0 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
2c8d0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
2c8e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
2c8f0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20  journal */.     
2c900 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c910 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2c920 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , i, &pPage);.  
2c930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2c940 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c950 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2c960 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
2c970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2c980 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b  gerWrite(pPage);
2c990 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c9a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
2c9b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
2c9c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c9d0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2c9e0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
2c9f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ca00 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
2ca10 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b  dbSize = dbSize;
2ca20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
2ca30 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2ca40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
2ca50 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
2ca60 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20  rnal file. If a 
2ca70 6d 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a  master .    ** j
2ca80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2ca90 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2caa0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2cab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a   journal file, .
2cac0 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61      ** or if zMa
2cad0 73 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f  ster is NULL (no
2cae0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29   master journal)
2caf0 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
2cb00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
2cb10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69   */.    rc = wri
2cb20 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
2cb30 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
2cb40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2cb50 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2cb60 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2cb70 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
2cb80 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2cb90 69 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d  ile. If the atom
2cba0 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
2cbb0 7a 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a  zation is being.
2cbc0 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69      ** used, thi
2cbd0 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20  s call will not 
2cbe0 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  create the journ
2cbf0 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f  al file or perfo
2cc00 72 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65  rm any.    ** re
2cc10 61 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20  al IO..    */.  
2cc20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
2cc30 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
2cc40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cc50 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2cc60 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2cc70 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
2cc80 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
2cc90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cca0 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  le. */.    rc = 
2ccb0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2ccc0 6c 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63  list(sqlite3Pcac
2ccd0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
2cce0 65 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20  er->pPCache));. 
2ccf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cd00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
2cd10 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2cd20 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
2cd30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d  ;.      goto com
2cd40 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2cd50 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  it;.    }.    sq
2cd60 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
2cd70 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
2cd80 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  che);..    /* If
2cd90 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
2cda0 6b 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d  k is not the sam
2cdb0 65 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61  e size as the da
2cdc0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20  tabase image,.  
2cdd0 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61    ** then use pa
2cde0 67 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20  ger_truncate to 
2cdf0 67 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74  grow or shrink t
2ce00 68 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20  he file here..  
2ce10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
2ce20 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61  ger->dbSize!=pPa
2ce30 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2ce40 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e  ){.      Pgno nN
2ce50 65 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ew = pPager->dbS
2ce60 69 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64  ize - (pPager->d
2ce70 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f  bSize==PAGER_MJ_
2ce80 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
2ce90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2cea0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2ceb0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  R_EXCLUSIVE );. 
2cec0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2ced0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
2cee0 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66   nNew);.      if
2cef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cf00 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2cf10 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2cf20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61    }..    /* Fina
2cf30 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61  lly, sync the da
2cf40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2cf50 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2cf60 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79  >noSync && !noSy
2cf70 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
2cf80 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
2cf90 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
2cfa0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
2cfb0 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
2cfc0 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
2cfd0 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
2cfe0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2cff0 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
2d000 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  }..commit_phase_
2d010 6f 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  one_exit:.  retu
2d020 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2d030 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
2d040 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
2d050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d060 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65   has been comple
2d070 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20  tely.** updated 
2d080 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63  to reflect the c
2d090 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
2d0a0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2d0b0 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79  action and.** sy
2d0c0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68  nced to disk. Th
2d0d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
2d0e0 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74  till exists in t
2d0f0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
2d100 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69  ** though, and i
2d110 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
2d120 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
2d130 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61   it will eventua
2d140 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61  lly.** be used a
2d150 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
2d160 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
2d170 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
2d180 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2d190 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
2d1a0 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e  alizes the journ
2d1b0 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20  al file, either 
2d1c0 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a  by deleting, .**
2d1d0 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70   truncating or p
2d1e0 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67  artially zeroing
2d1f0 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20   it, so that it 
2d200 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a  cannot be used .
2d210 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e  ** for hot-journ
2d220 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63  al rollback. Onc
2d230 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74  e this is done t
2d240 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2d250 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79  s.** irrevocably
2d260 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2d270 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2d280 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
2d290 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2d2a0 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ed and the pager
2d2b0 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74  .** moves into t
2d2c0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2d2d0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2d2e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2d2f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d300 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2d310 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65  Two(Pager *pPage
2d320 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2d330 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2d350 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2d360 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
2d370 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
2d380 6c 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20  lled if a prior 
2d390 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
2d3a0 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20  ed..  ** But if 
2d3b0 28 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67  (due to a coding
2d3c0 20 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65   error elsewhere
2d3d0 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20   in the system) 
2d3e0 69 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a  it does get.  **
2d3f0 20 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65   called, just re
2d400 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72  turn the same er
2d410 72 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74  ror code without
2d420 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
2d430 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2d440 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2d450 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
2d460 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
2d470 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2d480 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2d490 6c 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72  led if the pager
2d4a0 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65   is not in at le
2d4b0 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52  ast.  ** PAGER_R
2d4c0 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41  ESERVED state. A
2d4d0 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65  nd indeed SQLite
2d4e0 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73   never does this
2d4f0 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a  . But it is.  **
2d500 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68   nice to have th
2d510 69 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73  is defensive tes
2d520 74 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20  t here anyway.. 
2d530 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2d540 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
2d550 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20  GER_RESERVED) ) 
2d560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2d570 52 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70  ROR;..  /* An op
2d580 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74  timization. If t
2d590 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2d5a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
2d5b0 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a  ified during.  *
2d5c0 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2d5d0 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  on, the pager is
2d5e0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2d5f0 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69  usive-mode and i
2d600 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72  s.  ** using per
2d610 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  sistent journals
2d620 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2d630 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2d640 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2d650 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2d660 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
2d670 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ly contains a si
2d680 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  ngle journal .  
2d690 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74  ** header with t
2d6a0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65  he nRec field se
2d6b0 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20  t to 0. If such 
2d6c0 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65  a journal is use
2d6d0 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  d as.  ** a hot-
2d6e0 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68  journal during h
2d6f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2d700 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77  ack, 0 changes w
2d710 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a  ill be made.  **
2d720 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2d730 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20   file. So there 
2d740 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65  is no need to ze
2d750 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  ro the journal .
2d760 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e    ** header. Sin
2d770 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
2d780 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2d790 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  e, there is no n
2d7a0 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70  eed.  ** to drop
2d7b0 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65   any locks eithe
2d7c0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  r..  */.  if( pP
2d7d0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2d7e0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
2d7f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
2d800 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2d810 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2d820 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2d830 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ST.  ){.    asse
2d840 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2d850 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
2d860 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
2d870 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2d880 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
2d890 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
2d8a0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
2d8b0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
2d8c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2d8d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
2d8e0 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
2d8f0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2d900 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
2d910 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2d920 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2d930 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2d940 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2d950 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2d960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
2d970 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
2d980 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
2d990 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
2d9a0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
2d9b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d9c0 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
2d9d0 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
2d9e0 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
2d9f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2da00 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
2da10 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2da20 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
2da30 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
2da40 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
2da50 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
2da60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
2da70 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
2da80 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
2da90 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
2daa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
2dab0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2dac0 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
2dad0 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
2dae0 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
2daf0 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
2db00 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
2db10 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
2db20 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
2db30 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2db40 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
2db50 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
2db60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2db70 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
2db80 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
2db90 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2dba0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
2dbb0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
2dbc0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
2dbd0 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
2dbe0 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2dbf0 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2dc00 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
2dc10 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
2dc20 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
2dc30 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
2dc40 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
2dc50 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
2dc60 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
2dc70 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
2dc80 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
2dc90 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
2dca0 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
2dcb0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
2dcc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
2dcd0 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
2dce0 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
2dcf0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
2dd00 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2dd10 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
2dd20 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
2dd30 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cussful, also at
2dd40 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
2dd50 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
2dd60 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
2dd70 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
2dd80 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2dd90 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
2dda0 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
2ddb0 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
2ddc0 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
2ddd0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2dde0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
2ddf0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2de00 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
2de10 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
2de20 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2de30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
2de40 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
2de50 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
2de60 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
2de70 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
2de80 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
2de90 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
2dea0 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
2deb0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
2dec0 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
2ded0 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
2dee0 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
2def0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2df00 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2df10 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
2df20 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
2df30 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
2df40 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
2df50 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
2df60 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
2df70 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
2df80 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
2df90 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
2dfa0 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
2dfb0 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
2dfc0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
2dfd0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
2dfe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
2dff0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2e000 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
2e010 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
2e020 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
2e030 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
2e040 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
2e050 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
2e060 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2e070 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
2e080 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
2e090 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
2e0a0 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
2e0b0 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
2e0c0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
2e0d0 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
2e0e0 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
2e0f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
2e100 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2e110 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
2e120 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2e130 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e140 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2e150 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2e160 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
2e170 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
2e180 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2e190 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70  ger)));.  if( !p
2e1a0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2e1b0 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  d || !isOpen(pPa
2e1c0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2e1d0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2e1e0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2e1f0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2e200 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  aster);.  }else 
2e210 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
2e220 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2e230 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
2e240 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
2e250 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2e260 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
2e270 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
2e280 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2e290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2e2a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e2b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2e2c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2e2d0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2e2e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2e2f0 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  2;.      rc = pa
2e300 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2e310 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ger, 0);.      r
2e320 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
2e330 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2e340 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2e350 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
2e360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e370 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
2e380 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
2e390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2e3a0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
2e3b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2e3c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
2e3d0 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
2e3e0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2e3f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2e400 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2e410 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
2e420 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
2e430 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
2e440 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2e450 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
2e460 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
2e470 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
2e480 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
2e490 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
2e4a0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
2e4b0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
2e4c0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
2e4d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e4e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2e4f0 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
2e500 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
2e510 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
2e520 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2e530 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2e540 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
2e550 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
2e560 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
2e570 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
2e580 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2e590 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
2e5a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2e5b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2e5c0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2e5d0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e5e0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
2e5f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e600 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e610 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
2e620 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2e640 6e 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74  n the approximat
2e650 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2e660 73 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72  s of memory curr
2e670 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79  ently.** used by
2e680 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
2e690 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 63 61  ts associated ca
2e6a0 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  che..*/.int sqli
2e6b0 74 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28  te3PagerMemUsed(
2e6c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e6d0 20 20 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a    int perPageSiz
2e6e0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
2e6f0 53 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e  Size + pPager->n
2e700 45 78 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65  Extra + 20;.  re
2e710 74 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65  turn perPageSize
2e720 2a 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61  *sqlite3PcachePa
2e730 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
2e740 70 50 43 61 63 68 65 29 0a 20 20 20 20 20 20 20  pPCache).       
2e750 20 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c      + sqlite3Mal
2e760 6c 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b  locSize(pPager);
2e770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e780 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
2e790 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2e7a0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
2e7b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2e7c0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
2e7d0 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b  (DbPage *pPage){
2e7e0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2e7f0 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f  3PcachePageRefco
2e800 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23  unt(pPage);.}..#
2e810 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2e820 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  T./*.** This rou
2e830 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
2e840 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
2e850 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
2e860 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  nt *sqlite3Pager
2e870 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  Stats(Pager *pPa
2e880 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
2e890 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
2e8a0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2e8b0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2e8c0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31  >pPCache);.  a[1
2e8d0 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2e8e0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
2e8f0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2e900 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [2] = sqlite3Pca
2e910 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28  cheGetCachesize(
2e920 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e930 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
2e940 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f  r->dbSizeValid ?
2e950 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64   (int) pPager->d
2e960 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b  bSize : -1;.  a[
2e970 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
2e980 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
2e990 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2e9a0 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
2e9b0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
2e9c0 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
2e9d0 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
2e9e0 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
2e9f0 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
2ea00 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
2ea10 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
2ea20 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
2ea30 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
2ea40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
2ea50 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2ea60 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
2ea70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ea80 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67  PagerIsMemdb(Pag
2ea90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2eaa0 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a  eturn MEMDB;.}..
2eab0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
2eac0 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65   there are at le
2ead0 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73  ast nSavepoint s
2eae0 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20  avepoints open. 
2eaf0 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  If there are.** 
2eb00 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74  currently less t
2eb10 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20  han nSavepoints 
2eb20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20  open, then open 
2eb30 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
2eb40 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b  points.** to mak
2eb50 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65  e up the differe
2eb60 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62  nce. If the numb
2eb70 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
2eb80 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65   is already.** e
2eb90 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69  qual to nSavepoi
2eba0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  nt, then this fu
2ebb0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2ebc0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  p..**.** If a me
2ebd0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2ebe0 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
2ebf0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e  MEM is returned.
2ec00 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   If an error .**
2ec10 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
2ec20 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f  ening the sub-jo
2ec30 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
2ec40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2ec50 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  e is.** returned
2ec60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
2ec70 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
2ec80 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
2ec90 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
2eca0 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76  pPager, int nSav
2ecb0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
2ecc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2ecf0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ode */.  int nCu
2ed00 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  rrent = pPager->
2ed10 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20  nSavepoint;     
2ed20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75     /* Current nu
2ed30 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
2ed40 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61  ts */..  if( nSa
2ed50 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74  vepoint>nCurrent
2ed60 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
2ed70 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
2ed80 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eda0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
2edb0 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
2edc0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
2edd0 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *aNew;         
2ede0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2edf0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2ee00 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  t array */.    i
2ee10 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
2ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee30 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2ee40 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
2ee50 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  */..    rc = sql
2ee60 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
2ee70 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2ee80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2ee90 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
2eea0 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67   /* Grow the Pag
2eeb0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72  er.aSavepoint ar
2eec0 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f  ray using reallo
2eed0 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  c(). Return SQLI
2eee0 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20  TE_NOMEM.    ** 
2eef0 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  if the allocatio
2ef00 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69  n fails. Otherwi
2ef10 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77  se, zero the new
2ef20 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65   portion in case
2ef30 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f   a .    ** mallo
2ef40 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
2ef50 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e   while populatin
2ef60 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28  g it in the for(
2ef70 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e  ...) loop below.
2ef80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77  .    */.    aNew
2ef90 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69   = (PagerSavepoi
2efa0 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  nt *)sqlite3Real
2efb0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61  loc(.        pPa
2efc0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c  ger->aSavepoint,
2efd0 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
2efe0 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69  epoint)*nSavepoi
2eff0 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  nt.    );.    if
2f000 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !aNew ){.     
2f010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2f020 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2f030 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75  memset(&aNew[nCu
2f040 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76  rrent], 0, (nSav
2f050 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29  epoint-nCurrent)
2f060 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53   * sizeof(PagerS
2f070 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20  avepoint));.    
2f080 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2f090 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70  nt = aNew;.    p
2f0a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2f0b0 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  t = nSavepoint;.
2f0c0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
2f0d0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
2f0e0 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a  int structures j
2f0f0 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a  ust allocated. *
2f100 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75  /.    for(ii=nCu
2f110 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70  rrent; ii<nSavep
2f120 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
2f130 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69     aNew[ii].nOri
2f140 67 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  g = nPage;.     
2f150 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
2f160 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
2f170 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
2f180 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77   ){.        aNew
2f190 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70  [ii].iOffset = p
2f1a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2f1b0 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  f;.      }else{.
2f1c0 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
2f1d0 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e  .iOffset = JOURN
2f1e0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
2f1f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f200 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65   aNew[ii].iSubRe
2f210 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  c = pPager->nSub
2f220 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b  Rec;.      aNew[
2f230 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
2f240 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
2f250 43 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20  Create(nPage);. 
2f260 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69       if( !aNew[i
2f270 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
2f280 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2f290 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2f2a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2f2b0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
2f2c0 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  ub-journal, if i
2f2d0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2f2e0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
2f2f0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2f300 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
2f310 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
2f320 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
2f330 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2f340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2f350 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2f360 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
2f370 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f  k or release (co
2f380 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e  mmit) a savepoin
2f390 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f  t..** The savepo
2f3a0 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f  int to release o
2f3b0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20  r rollback need 
2f3c0 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20  not be the most 
2f3d0 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65  recently .** cre
2f3e0 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a  ated savepoint..
2f3f0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
2f400 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74  op is always eit
2f410 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
2f420 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f  LLBACK or SAVEPO
2f430 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20  INT_RELEASE..** 
2f440 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
2f450 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
2f460 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73   release and des
2f470 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
2f480 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  nt with.** index
2f490 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20   iSavepoint. If 
2f4a0 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
2f4b0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72  ROLLBACK, then r
2f4c0 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
2f4d0 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ges.** that have
2f4e0 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20   occurred since 
2f4f0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
2f500 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61  vepoint was crea
2f510 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
2f520 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c  avepoint to roll
2f530 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
2f540 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
2f550 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69   parameter .** i
2f560 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c  Savepoint. A val
2f570 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f  ue of 0 means to
2f580 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
2f590 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
2f5a0 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73  int.** (the firs
2f5b0 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61  t created). A va
2f5c0 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53  lue of (Pager.nS
2f5d0 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e  avepoint-1) mean
2f5e0 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20  s operate.** on 
2f5f0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
2f600 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  y created savepo
2f610 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69  int. If iSavepoi
2f620 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
2f630 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61  an.** (Pager.nSa
2f640 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e  vepoint-1), then
2f650 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2f660 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2f670 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76   If a negative v
2f680 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74  alue is passed t
2f690 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2f6a0 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
2f6b0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2f6c0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
2f6d0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
2f6e0 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a  nt to calling .*
2f6f0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
2f700 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65  llback() because
2f710 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
2f720 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  oes not terminat
2f730 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  e.** the transac
2f740 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  tion or unlock t
2f750 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
2f760 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68  just restores th
2f770 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
2f780 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2f790 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
2f7a0 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20  tate. .**.** In 
2f7b0 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  any case, all sa
2f7c0 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
2f7d0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
2f7e0 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
2f7f0 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
2f800 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  . If this is a r
2f810 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e  elease operation
2f820 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
2f830 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65  RELEASE),.** the
2f840 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  n savepoint iSav
2f850 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64  epoint is also d
2f860 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
2f870 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2f880 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2f890 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72  NOMEM if a memor
2f8a0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
2f8b0 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20  ls,.** or an IO 
2f8c0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2f8d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2f8e0 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62   while rolling b
2f8f0 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f  ack a .** savepo
2f900 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  int. If no error
2f910 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  s occur, SQLITE_
2f920 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2f930 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
2f940 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
2f950 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2f960 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
2f970 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
2f980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2f990 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
2f9a0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
2f9b0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
2f9c0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
2f9d0 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
2f9e0 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 || op==SAVEPOI
2f9f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a  NT_ROLLBACK );..
2fa00 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
2fa10 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
2fa20 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  int ){.    int i
2fa30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
2fa40 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2fa50 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  le */.    int nN
2fa60 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew;          /* 
2fa70 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e  Number of remain
2fa80 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ing savepoints a
2fa90 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f  fter this op. */
2faa0 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
2fab0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76  out how many sav
2fac0 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69  epoints will sti
2fad0 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
2fae0 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f  er this.    ** o
2faf0 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20  peration. Store 
2fb00 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e  this value in nN
2fb10 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65  ew. Then free re
2fb20 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74  sources associat
2fb30 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ed .    ** with 
2fb40 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
2fb50 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65  hat are destroye
2fb60 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
2fb70 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
2fb80 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e  nNew = iSavepoin
2fb90 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50  t + (( op==SAVEP
2fba0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f  OINT_RELEASE ) ?
2fbb0 20 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72   0 : 1);.    for
2fbc0 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61  (ii=nNew; ii<pPa
2fbd0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
2fbe0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71   ii++){.      sq
2fbf0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
2fc00 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
2fc10 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
2fc20 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
2fc30 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
2fc40 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20  point = nNew;.. 
2fc50 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2fc60 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
2fc70 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
2fc80 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
2fc90 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
2fca0 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20  journal to zero 
2fcb0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a  bytes in size. *
2fcc0 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  /.    if( op==SA
2fcd0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
2fce0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65  ){.      if( nNe
2fcf0 77 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70  w==0 && isOpen(p
2fd00 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
2fd10 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
2fd20 74 72 75 6e 63 61 74 65 20 69 66 20 69 74 20 69  truncate if it i
2fd30 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  s an in-memory s
2fd40 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
2fd50 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2fd60 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
2fd70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
2fd80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2fd90 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
2fda0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30  (pPager->sjfd, 0
2fdb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2fdc0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2fdd0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OK );.        }.
2fde0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2fdf0 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20  nSubRec = 0;.   
2fe00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
2fe10 2a 20 45 6c 73 65 20 74 68 69 73 20 69 73 20 61  * Else this is a
2fe20 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
2fe30 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68  ion, playback th
2fe40 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
2fe50 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66  point..    ** If
2fe60 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d   this is a temp-
2fe70 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73  file, it is poss
2fe80 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ible that the jo
2fe90 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20  urnal file has. 
2fea0 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65     ** not yet be
2feb0 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  en opened. In th
2fec0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61  is case there ha
2fed0 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
2fee0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  es to.    ** the
2fef0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2ff00 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  so the playback 
2ff10 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65  operation can be
2ff20 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
2ff30 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 73  .    else if( is
2ff40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2ff50 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
2ff60 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
2ff70 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30  point = (nNew==0
2ff80 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61  )?0:&pPager->aSa
2ff90 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b  vepoint[nNew-1];
2ffa0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2ffb0 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
2ffc0 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 65  nt(pPager, pSave
2ffd0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73  point);.      as
2ffe0 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f  sert(rc!=SQLITE_
2fff0 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  DONE);.    }.  .
30000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
30020 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
30030 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
30040 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
30050 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
30060 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67  agerFilename(Pag
30070 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
30080 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
30090 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
300a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53  * Return the VFS
300b0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
300c0 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e  he pager..*/.con
300d0 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  st sqlite3_vfs *
300e0 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
300f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
30100 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
30110 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pVfs;.}../*.** 
30120 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20  Return the file 
30130 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64  handle for the d
30140 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
30150 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
30160 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
30170 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55   might return NU
30180 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68  LL if the file h
30190 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65  as.** not yet be
301a0 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71  en opened..*/.sq
301b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69  lite3_file *sqli
301c0 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67  te3PagerFile(Pag
301d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
301e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
301f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30200 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
30210 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
30220 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
30230 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
30240 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
30250 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
30260 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
30270 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
30280 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
30290 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
302a0 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
302b0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
302c0 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
302d0 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
302e0 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
302f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30300 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
30310 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
30320 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
30330 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
30340 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
30350 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65 74  /*.** Set or ret
30360 72 69 65 76 65 20 74 68 65 20 63 6f 64 65 63 20  rieve the codec 
30370 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
30380 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
30390 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64  lite3PagerSetCod
303a0 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
303b0 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
303c0 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
303d0 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
303e0 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a  void (*xCodecSiz
303f0 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74  eChng)(void*,int
30400 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ,int),.  void (*
30410 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
30420 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  *),.  void *pCod
30430 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ec.){.  if( pPag
30440 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
30450 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
30460 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
30470 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  ec);.  pPager->x
30480 43 6f 64 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  Codec = pPager->
30490 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f 64  memDb ? 0 : xCod
304a0 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ec;.  pPager->xC
304b0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78  odecSizeChng = x
304c0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20  CodecSizeChng;. 
304d0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
304e0 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65  ree = xCodecFree
304f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
30500 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70  ec = pCodec;.  p
30510 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
30520 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63  Pager);.}.static
30530 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61   void *sqlite3Pa
30540 67 65 72 47 65 74 43 6f 64 65 63 28 50 61 67 65  gerGetCodec(Page
30550 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
30560 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f  turn pPager->pCo
30570 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  dec;.}.#endif..#
30580 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30590 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
305a0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
305b0 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
305c0 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
305d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  le..**.** There 
305e0 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
305f0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
30600 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
30610 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20  ated at.** pgno 
30620 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70  (which we call p
30630 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68  PgOld) though th
30640 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77  at page is allow
30650 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63  ed to be.** in c
30660 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61  ache.  If the pa
30670 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
30680 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73  cated at pgno is
30690 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
306a0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
306b0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
306c0 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20  ot put there by 
306d0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
306e0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
306f0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50  s to the page pP
30700 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  g remain valid. 
30710 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
30720 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
30730 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69  ated with pPg (i
30740 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
30750 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
30760 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
30770 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
30780 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
30790 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
307a0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
307b0 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
307c0 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
307d0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
307e0 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
307f0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
30800 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
30810 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
30820 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
30830 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
30840 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
30850 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
30860 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
30870 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
30880 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
30890 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
308a0 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20   active)..**.** 
308b0 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  If the fourth ar
308c0 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74  gument, isCommit
308d0 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  , is non-zero, t
308e0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73  hen this page is
308f0 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20   being.** moved 
30900 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74  as part of a dat
30910 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61  abase reorganiza
30920 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65  tion just before
30930 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
30940 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f   .** is being co
30950 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73  mmitted. In this
30960 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61   case, it is gua
30970 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
30980 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a   database page .
30990 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f  ** pPg refers to
309a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
309b0 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69  tten to again wi
309c0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
309d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ction..**.** Thi
309e0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
309f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
30a00 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
30a10 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
30a20 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74  or.** occurs. Ot
30a30 68 65 72 77 69 73 65 2c 20 69 74 20 72 65 74 75  herwise, it retu
30a40 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
30a50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
30a60 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72  erMovepage(Pager
30a70 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65   *pPager, DbPage
30a80 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
30a90 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b  , int isCommit){
30aa0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
30ab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30ac0 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e  /* The page bein
30ad0 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a  g overwritten. *
30ae0 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e  /.  Pgno needSyn
30af0 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20  cPgno = 0;      
30b00 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66   /* Old value of
30b10 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73   pPg->pgno, if s
30b20 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 20  ync is required 
30b30 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
30b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b50 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
30b60 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50   */.  Pgno origP
30b70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
30b80 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e     /* The origin
30b90 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  al page number *
30ba0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  /..  assert( pPg
30bb0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f  ->nRef>0 );..  /
30bc0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * In order to be
30bd0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
30be0 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  k, an in-memory 
30bf0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 6a 6f  database must jo
30c00 75 72 6e 61 6c 0a 20 20 2a 2a 20 74 68 65 20 70  urnal.  ** the p
30c10 61 67 65 20 77 65 20 61 72 65 20 6d 6f 76 69 6e  age we are movin
30c20 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69  g from..  */.  i
30c30 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
30c40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30c50 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
30c60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
30c70 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
30c80 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
30c90 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79 20   moved is dirty 
30ca0 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  and has not been
30cb0 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c 61   saved by the la
30cc0 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f  test.  ** savepo
30cd0 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74  int, then save t
30ce0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
30cf0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30d00 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73  into the .  ** s
30d10 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20  ub-journal now. 
30d20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
30d30 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66   to handle the f
30d40 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69  ollowing scenari
30d50 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42  o:.  **.  **   B
30d60 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c  EGIN;.  **     <
30d70 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20  journal page X, 
30d80 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69  then modify it i
30d90 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20  n memory>.  **  
30da0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
30db0 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f  ;.  **       <Mo
30dc0 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63  ve page X to loc
30dd0 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20  ation Y>.  **   
30de0 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
30df0 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e;.  **.  ** If 
30e00 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20  page X were not 
30e10 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
30e20 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c  ub-journal here,
30e30 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20   it would not.  
30e40 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
30e50 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f  o restore its co
30e60 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20  ntents when the 
30e70 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65  "ROLLBACK TO one
30e80 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ".  ** statement
30e90 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73 73   were is process
30ea0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75  ed..  **.  ** su
30eb0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d  bjournalPage() m
30ec0 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63  ay need to alloc
30ed0 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f  ate space to sto
30ee0 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74  re pPg->pgno int
30ef0 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f  o.  ** one or mo
30f00 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74  re savepoint bit
30f10 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74 68  vecs. This is th
30f20 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75  e reason this fu
30f30 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20  nction.  ** may 
30f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
30f50 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  MEM..  */.  if( 
30f60 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
30f70 5f 44 49 52 54 59 0a 20 20 20 26 26 20 73 75 62  _DIRTY.   && sub
30f80 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
30f90 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f  g).   && SQLITE_
30fa0 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75  OK!=(rc = subjou
30fb0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20  rnalPage(pPg)). 
30fc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
30fd0 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  c;.  }..  PAGERT
30fe0 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70  RACE(("MOVE %d p
30ff0 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
31000 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
31010 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
31020 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
31030 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c  ->pgno, (pPg->fl
31040 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
31050 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29  YNC)?1:0, pgno))
31060 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
31070 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
31080 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
31090 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20  o, pgno))..  /* 
310a0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  If the journal n
310b0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
310c0 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65 20  )ed before page 
310d0 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20  pPg->pgno can.  
310e0 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ** be written to
310f0 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  , store pPg->pgn
31100 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  o in local varia
31110 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  ble needSyncPgno
31120 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
31130 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
31140 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20 69   is set, there i
31150 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
31160 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20  ember that.  ** 
31170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
31180 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
31190 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
311a0 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20   page pPg->pgno 
311b0 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  .  ** can be wri
311c0 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
311d0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
311e0 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
311f0 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a  write to it..  *
31200 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  /.  if( (pPg->fl
31210 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
31220 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69  YNC) && !isCommi
31230 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  t ){.    needSyn
31240 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
31250 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
31260 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
31270 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
31280 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
31290 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
312a0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
312b0 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61  R_DIRTY );.    a
312c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
312d0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
312e0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
312f0 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67  e contains a pag
31300 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  e with page-numb
31310 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20  er pgno, remove 
31320 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73  it.  ** from its
31330 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
31340 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e  o, if the PgHdr.
31350 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74  needSync was set
31360 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20   for .  ** page 
31370 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20  pgno before the 
31380 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e  'move' operation
31390 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  , it needs to be
313a0 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20   retained .  ** 
313b0 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76  for the page mov
313c0 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  ed there..  */. 
313d0 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
313e0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
313f0 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
31400 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
31410 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
31420 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67  ( !pPgOld || pPg
31430 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  Old->nRef==1 );.
31440 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
31450 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
31460 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73  = (pPgOld->flags
31470 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
31480 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
31490 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20   ){.      /* Do 
314a0 6e 6f 74 20 64 69 73 63 61 72 64 20 70 61 67 65  not discard page
314b0 73 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d  s from an in-mem
314c0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 69 6e  ory database sin
314d0 63 65 20 77 65 20 6d 69 67 68 74 0a 20 20 20 20  ce we might.    
314e0 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 72 6f 6c    ** need to rol
314f0 6c 62 61 63 6b 20 6c 61 74 65 72 2e 20 20 4a 75  lback later.  Ju
31500 73 74 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  st move the page
31510 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 2e   out of the way.
31520 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
31530 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
31540 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 73  Valid );.      s
31550 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
31560 28 70 50 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d  (pPgOld, pPager-
31570 3e 64 62 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20  >dbSize+1);.    
31580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
31590 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
315a0 50 67 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  PgOld);.    }.  
315b0 7d 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20  }..  origPgno = 
315c0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c  pPg->pgno;.  sql
315d0 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
315e0 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c  Pg, pgno);.  sql
315f0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
31600 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
31610 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
31620 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
31630 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
31640 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
31650 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
31660 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
31670 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
31680 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
31690 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
316a0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
316b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
316c0 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
316d0 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
316e0 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
316f0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
31700 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
31710 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75   .    ** "is jou
31720 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66  rnaled" bitvec f
31730 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74  lag has been set
31740 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
31750 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20  be remedied by. 
31760 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68     ** loading th
31770 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
31780 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
31790 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
317a0 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
317b0 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  ** flag..    **.
317c0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
317d0 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68  tempt to load th
317e0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
317f0 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73  page-cache fails
31800 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f  , (due.    ** to
31810 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
31820 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61  O failure), clea
31830 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65  r the bit in the
31840 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20   pInJournal[].  
31850 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65    ** array. Othe
31860 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61  rwise, if the pa
31870 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  ge is loaded and
31880 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69   written again i
31890 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72  n.    ** this tr
318a0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
318b0 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  y be written to 
318c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
318d0 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
318e0 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74  it is synced int
318f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
31900 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74  le. This way, it
31910 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20   may end up in. 
31920 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
31930 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75  l file twice, bu
31940 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
31950 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a  problem..    **.
31960 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
31970 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
31980 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
31990 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
319a0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
319b0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
319c0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
319d0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
319e0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
319f0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
31a00 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
31a10 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
31a20 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
31a30 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
31a40 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
31a50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31a60 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  K ){.      if( n
31a70 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61  eedSyncPgno<=pPa
31a80 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
31a90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
31aa0 74 28 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  t( pPager->pTmpS
31ab0 70 61 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  pace!=0 );.     
31ac0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
31ad0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
31ae0 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
31af0 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e  ncPgno, pPager->
31b00 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
31b10 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
31b20 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
31b30 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
31b40 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
31b50 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d   pPager->noSync=
31b60 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  =0 && !MEMDB );.
31b70 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67      pPgHdr->flag
31b80 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
31b90 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65  SYNC;.    sqlite
31ba0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
31bb0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71  (pPgHdr);.    sq
31bc0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
31bd0 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPgHdr);.  }..  
31be0 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69  /*.  ** For an i
31bf0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
31c00 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  e, make sure the
31c10 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
31c20 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f  ontinues.  ** to
31c30 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20   exist, in case 
31c40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
31c50 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61  needs to roll ba
31c60 63 6b 2e 20 20 55 73 65 20 70 50 67 4f 6c 64 0a  ck.  Use pPgOld.
31c70 20 20 2a 2a 20 61 73 20 74 68 65 20 6f 72 69 67    ** as the orig
31c80 69 6e 61 6c 20 70 61 67 65 20 73 69 6e 63 65 20  inal page since 
31c90 69 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  it has already b
31ca0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20  een allocated.. 
31cb0 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
31cc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
31cd0 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c  acheMove(pPgOld,
31ce0 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20   origPgno);.    
31cf0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
31d00 66 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a  f(pPgOld);.  }..
31d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31d20 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
31d30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
31d40 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61  nter to the data
31d50 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
31d60 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
31d70 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
31d80 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50  tData(DbPage *pP
31d90 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
31da0 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67  g->nRef>0 || pPg
31db0 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ->pPager->memDb 
31dc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
31dd0 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pData;.}../*.**
31de0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
31df0 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e  r to the Pager.n
31e00 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22  Extra bytes of "
31e10 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a  extra" space .**
31e20 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
31e30 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
31e40 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
31e50 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
31e60 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a  etExtra(DbPage *
31e70 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
31e80 50 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f  Pg->pExtra;.}../
31e90 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
31ea0 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
31eb0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
31ec0 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
31ed0 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
31ee0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31ef0 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
31f00 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
31f10 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
31f20 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
31f30 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
31f40 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
31f50 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
31f60 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
31f70 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
31f80 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
31f90 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
31fa0 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
31fb0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31fc0 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
31fd0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31fe0 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
31ff0 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
32000 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
32010 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
32020 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
32030 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
32040 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
32050 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
32060 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
32070 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
32080 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
32090 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
320a0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
320b0 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
320c0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
320d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
320e0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
320f0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
32100 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
32110 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
32120 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
32130 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
32140 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
32150 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
32160 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
32170 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
32180 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
32190 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
321a0 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20  e = (u8)eMode;. 
321b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
321c0 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
321d0 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  veMode;.}../*.**
321e0 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75   Get/set the jou
321f0 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68  rnal-mode for th
32200 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
32210 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
32220 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e one of:.**.** 
32230 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
32240 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20  MODE_QUERY.**   
32250 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
32260 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  DE_DELETE.**    
32270 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32280 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  E_TRUNCATE.**   
32290 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
322a0 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  DE_PERSIST.**   
322b0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
322c0 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47  DE_OFF.**    PAG
322d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
322e0 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74  EMORY.**.** If t
322f0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
32300 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
32310 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
32320 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  e is set to the.
32330 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  ** value specifi
32340 65 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65  ed if the change
32350 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68   is allowed.  Th
32360 65 20 63 68 61 6e 67 65 20 69 73 20 64 69 73 61  e change is disa
32370 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68  llowed.** for th
32380 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73  e following reas
32390 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ons:.**.**   *  
323a0 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  An in-memory dat
323b0 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68  abase can only h
323c0 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f  ave its journal_
323d0 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46  mode set to _OFF
323e0 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d  .**      or _MEM
323f0 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ORY..**.**   *  
32400 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  The journal mode
32410 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
32420 67 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e  ged while a tran
32430 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
32440 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  e..**.** The ret
32450 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
32460 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
32470 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f  ibly updated) jo
32480 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
32490 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
324a0 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
324b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
324c0 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
324d0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
324e0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
324f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
32500 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32510 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20  ALMODE_DELETE.  
32520 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32530 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32540 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
32550 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
32560 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32570 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
32580 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
32590 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
325a0 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
325b0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
325c0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
325d0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
325e0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f  assert( PAGER_JO
325f0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c  URNALMODE_QUERY<
32600 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
32610 3e 3d 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44  >=0.   && (!MEMD
32620 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45  B || eMode==PAGE
32630 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
32640 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20  MORY .          
32650 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
32660 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32670 4f 46 46 29 0a 20 20 20 26 26 20 21 70 50 61 67  OFF).   && !pPag
32680 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20  er->dbModified. 
32690 20 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50    && (!isOpen(pP
326a0 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d  ager->jfd) || 0=
326b0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
326c0 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  Off).  ){.    if
326d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
326e0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73  >jfd) ){.      s
326f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
32700 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
32710 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  }.    assert( (P
32720 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32730 5f 54 52 55 4e 43 41 54 45 20 26 20 31 29 3d 3d  _TRUNCATE & 1)==
32740 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
32750 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
32760 4f 44 45 5f 50 45 52 53 49 53 54 20 26 20 31 29  ODE_PERSIST & 1)
32770 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
32780 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
32790 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26 20 31  LMODE_DELETE & 1
327a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
327b0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
327c0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20  ALMODE_MEMORY & 
327d0 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  1)==0 );.    ass
327e0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
327f0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 31 29  NALMODE_OFF & 1)
32800 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ==0 );.    if( (
32810 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
32820 6f 64 65 20 26 20 31 29 3d 3d 31 20 26 26 20 28  ode & 1)==1 && (
32830 65 4d 6f 64 65 20 26 20 31 29 3d 3d 30 0a 20 20  eMode & 1)==0.  
32840 20 20 20 20 20 20 20 26 26 20 21 70 50 61 67 65         && !pPage
32850 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32860 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32870 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
32880 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
32890 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
328a0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
328b0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75  journalMode = (u
328c0 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  8)eMode;.  }.  r
328d0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
328e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
328f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
32900 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
32910 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
32920 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
32930 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67  s..**.** Setting
32940 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20   the size limit 
32950 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c  to -1 means no l
32960 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64  imit is enforced
32970 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20  ..** An attempt 
32980 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73  to set a limit s
32990 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69  maller than -1 i
329a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36  s a no-op..*/.i6
329b0 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  4 sqlite3PagerJo
329c0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50  urnalSizeLimit(P
329d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36  ager *pPager, i6
329e0 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28  4 iLimit){.  if(
329f0 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20   iLimit>=-1 ){. 
32a00 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
32a10 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c  alSizeLimit = iL
32a20 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
32a30 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  rn pPager->journ
32a40 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a  alSizeLimit;.}..
32a50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
32a60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50  ointer to the pP
32a70 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61  ager->pBackup va
32a80 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b  riable. The back
32a90 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20  up module.** in 
32aa0 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69  backup.c maintai
32ab0 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ns the content o
32ac0 66 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e  f this variable.
32ad0 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20   This module.** 
32ae0 75 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79  uses it opaquely
32af0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
32b00 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  to sqlite3Backup
32b10 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a  Restart() and.**
32b20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
32b30 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a  date() only..*/.
32b40 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
32b50 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42 61 63  *sqlite3PagerBac
32b60 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a 70 50  kupPtr(Pager *pP
32b70 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
32b80 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  &pPager->pBackup
32b90 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
32ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
32bb0 4f 20 2a 2f 0a                                   O */.