/ Hex Artifact Content
Login

Artifact ab2482d819ae5c53bfcb1b8e673a00627d8fdeec:


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 21 69 73 53 61 76  E).   && (!isSav
ee20: 65 70 6e 74 20 7c 7c 20 70 50 67 3d 3d 30 20 7c  epnt || pPg==0 |
ee30: 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73  | 0==(pPg->flags
ee40: 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
ee50: 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28  )).   && isOpen(
ee60: 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
ee70: 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20 29 7b  & !isUnsync.  ){
ee80: 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
ee90: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
eea0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
eeb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
eec0: 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
eed0: 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
eee0: 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
eef0: 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  C)!=0 );.    rc 
ef00: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ef10: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
ef20: 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
ef30: 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29  >pageSize, ofst)
ef40: 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ;.    if( pgno>p
ef50: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
ef60: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
ef70: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
ef80: 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
ef90: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
efa0: 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  kup ){.      COD
efb0: 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
efc0: 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
efd0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
efe0: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
eff0: 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
f000: 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
f010: 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20  u8*)aData);.    
f020: 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
f030: 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c   aData, pgno, 7,
f040: 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
f050: 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  , aData);.    }.
f060: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
f070: 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
f080: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
f090: 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
f0a0: 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
f0b0: 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
f0c0: 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
f0d0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
f0e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
f0f0: 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
f100: 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
f110: 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
f120: 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
f130: 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
f140: 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
f150: 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
f160: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
f170: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
f180: 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
f190: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
f1a0: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
f1b0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f1c0: 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
f1d0: 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
f1e0: 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
f1f0: 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
f200: 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
f210: 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
f220: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
f230: 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
f240: 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
f250: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
f260: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
f270: 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
f280: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f290: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
f2a0: 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
f2b0: 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
f2c0: 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
f2d0: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
f2e0: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
f2f0: 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
f300: 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
f310: 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
f320: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
f330: 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
f340: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
f350: 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
f360: 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
f370: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
f380: 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
f390: 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
f3a0: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f3b0: 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
f3c0: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
f3d0: 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
f3e0: 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
f3f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
f400: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  vepnt );.    if(
f410: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
f420: 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
f430: 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
f440: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
f450: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
f470: 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
f480: 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
f490: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
f4a0: 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
f4b0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
f4c0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
f4d0: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
f4e0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
f4f0: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
f500: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
f510: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
f520: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
f530: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
f540: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
f550: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
f560: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
f570: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
f580: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
f590: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
f5a0: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
f5b0: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
f5c0: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
f5d0: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
f5e0: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
f5f0: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
f600: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
f610: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
f620: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
f630: 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
f640: 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
f650: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
f660: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
f670: 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69  (pPg);.    if( i
f680: 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
f690: 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66  sSavepnt || *pOf
f6a0: 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  fset<=pPager->jo
f6b0: 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
f6c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
f6d0: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
f6e0: 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
f6f0: 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
f700: 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
f710: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
f720: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
f730: 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
f740: 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
f750: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
f760: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
f770: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
f780: 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
f790: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
f7a0: 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
f7b0: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
f7c0: 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
f7d0: 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20  out to the..    
f7e0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
f7f0: 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
f800: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
f810: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
f820: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
f830: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
f840: 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
f850: 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
f860: 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
f870: 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
f880: 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
f890: 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
f8a0: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
f8b0: 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
f8c0: 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
f8d0: 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
f8e0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
f8f0: 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
f900: 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
f910: 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
f920: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
f930: 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
f940: 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
f950: 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
f960: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f970: 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
f980: 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
f990: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
f9a0: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
f9b0: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
f9c0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
f9d0: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
f9e0: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
f9f0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
fa00: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
fa10: 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
fa20: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
fa30: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
fa40: 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
fa50: 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
fa60: 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
fa70: 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
fa80: 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
fa90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
faa0: 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
fab0: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
fac0: 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
fad0: 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
fae0: 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
faf0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
fb00: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
fb10: 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
fb20: 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
fb30: 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
fb40: 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
fb50: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
fb60: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
fb70: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
fb80: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
fb90: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
fba0: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
fbb0: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
fbc0: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
fbd0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
fbe0: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
fbf0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
fc00: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
fc10: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
fc20: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
fc30: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
fc40: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
fc50: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
fc60: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
fc70: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
fc80: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
fc90: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
fca0: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
fcb0: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
fcc0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
fcd0: 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
fce0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
fcf0: 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
fd00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
fd10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
fd20: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
fd30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
fd40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
fd50: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
fd60: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
fd70: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
fd80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fd90: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
fda0: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
fdb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fdc0: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
fdd0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
fde0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
fdf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
fe00: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
fe10: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
fe20: 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
fe30: 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
fe40: 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
fe50: 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
fe60: 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
fe70: 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
fe80: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
fe90: 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72  ** When a master
fea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
feb0: 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20   created, it is 
fec0: 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
fed0: 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
fee0: 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
fef0: 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61   journals, one a
ff00: 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f  fter another, fo
ff10: 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38  rmatted as utf-8
ff20: 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78   .** encoded tex
ff30: 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61  t. The end of ea
ff40: 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
ff50: 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20   file is marked 
ff60: 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74  with a .** nul-t
ff70: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28  erminator byte (
ff80: 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20  0x00). i.e. the 
ff90: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
ffa0: 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
ffb0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  nal.** file for 
ffc0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
ffd0: 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61  volving two data
ffe0: 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a  bases might be:.
fff0: 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62  **.**   "/home/b
10000 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/a.db-journal
10010 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62  \x00/home/bill/b
10020 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22  .db-journal\x00"
10030 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20  .**.** A master 
10040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
10050 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64   only be deleted
10060 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73   once all of its
10070 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e   child .** journ
10080 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f  als have been ro
10090 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
100a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
100b0 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  eads the content
100c0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  s of the master-
100d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
100e0 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  o .** memory and
100f0 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65   loops through e
10100 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ach of the child
10110 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20   journal names. 
10120 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c  For.** each chil
10130 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68  d journal, it ch
10140 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  ecks if:.**.**  
10150 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
10160 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20  journal exists, 
10170 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a  and if so.**   *
10180 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
10190 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61  urnal contains a
101a0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61   reference to ma
101b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ster journal .**
101c0 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65       file zMaste
101d0 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69  r.**.** If a chi
101e0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
101f0 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74  e found that mat
10200 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65  ches both of the
10210 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f   criteria.** abo
10220 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ve, this functio
10230 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  n returns withou
10240 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
10250 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a  . Otherwise, if.
10260 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64  ** no such child
10270 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
10280 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73  found, file zMas
10290 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66  ter is deleted f
102a0 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d  rom.** the file-
102b0 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c  system using sql
102c0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
102d0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
102e0 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73  rror within this
102f0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72   function, an er
10300 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10310 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  rned. This.** fu
10320 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
10330 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69   memory by calli
10340 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ng sqlite3Malloc
10350 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61  (). If an alloca
10360 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  tion.** fails, S
10370 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
10380 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10390 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20  se, if no IO or 
103a0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a  malloc errors .*
103b0 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  * occur, SQLITE_
103c0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
103d0 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73  **.** TODO: This
103e0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
103f0 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f  tes a single blo
10400 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
10410 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69  load.** the enti
10420 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
10430 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10440 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75  l file. This cou
10450 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c  ld be.** a coupl
10460 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f  e of kilobytes o
10470 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c  r so - potential
10480 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ly larger than t
10490 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65  he page .** size
104a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
104b0 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
104c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
104d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
104e0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
104f0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
10500 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
10510 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10520 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10530 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
10540 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20  _file *pMaster; 
10550 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d     /* Malloc'd m
10560 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
10570 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
10580 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10590 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20  *pJournal;   /* 
105a0 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a  Malloc'd child-j
105b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
105c0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  riptor */.  char
105d0 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
105e0 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
105f0 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
10600 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
10610 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
10620 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
10630 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10640 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
10650 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
10660 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
10670 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
10680 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10690 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
106a0 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
106b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
106c0 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
106d0 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
106e0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
106f0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
10700 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
10710 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
10720 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
10730 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
10740 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
10750 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
10760 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
10770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10780 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
10790 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
107a0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
107b0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
107c0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
107d0 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
107e0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
107f0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
10800 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
10810 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
10820 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
10830 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
10840 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
10850 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
10860 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
10870 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10880 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
10890 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
108a0 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
108b0 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
108c0 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
108d0 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
108e0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
108f0 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
10900 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
10910 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
10920 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
10930 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
10940 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
10950 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
10960 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
10970 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
10980 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
10990 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
109a0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
109b0 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61  3Malloc((int)nMa
109c0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
109d0 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20  asterPtr + 1);. 
109e0 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
109f0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
10a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10a10 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
10a20 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
10a30 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
10a40 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
10a50 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
10a60 61 6c 2b 31 5d 3b 0a 20 20 20 20 72 63 20 3d 20  al+1];.    rc = 
10a70 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
10a80 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
10a90 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
10aa0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
10ab0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10ac0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
10ad0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
10ae0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
10af0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
10b00 20 30 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61   0;..    zJourna
10b10 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
10b20 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
10b30 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
10b40 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
10b50 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
10b60 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
10b70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
10b80 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
10b90 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
10ba0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
10bb0 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66  xists);.      if
10bc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10bd0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
10be0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
10bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10c00 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
10c10 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
10c20 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
10c30 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
10c40 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
10c50 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
10c60 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
10c70 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
10c80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10c90 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
10ca0 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
10cb0 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
10cc0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10cd0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
10ce0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
10cf0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
10d00 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
10d10 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
10d20 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
10d30 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
10d40 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
10d50 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
10d60 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
10d70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
10d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
10da0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
10db0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
10dc0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
10dd0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
10de0 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
10df0 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
10e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
10e10 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
10e20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
10e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10e40 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
10e50 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
10e60 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
10e70 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
10e80 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
10e90 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
10ea0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
10eb0 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
10ec0 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
10ed0 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
10ee0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
10ef0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
10f00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
10f10 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
10f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10f30 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
10f40 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
10f50 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
10f60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
10f70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
10f80 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
10f90 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
10fa0 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
10fb0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
10fc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10fd0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
10fe0 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 70 4d 61  .  }  .  if( pMa
10ff0 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ster ){.    sqli
11000 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
11010 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
11020 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61   !isOpen(pJourna
11030 6c 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  l) );.  }.  sqli
11040 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
11050 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11060 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
11070 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
11080 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
11090 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
110a0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
110b0 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
110c0 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
110d0 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
110e0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
110f0 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
11100 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
11110 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
11120 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
11130 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
11140 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
11150 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
11160 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
11170 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
11180 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c  ck is not.** hel
11190 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
111a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
111b0 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65  erwise, the size
111c0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 0a   of the file is.
111d0 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50  ** changed to nP
111e0 61 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65  age pages (nPage
111f0 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
11200 65 20 62 79 74 65 73 29 2e 20 49 66 20 74 68 65  e bytes). If the
11210 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b   file.** on disk
11220 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
11230 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
11240 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
11250 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
11260 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
11270 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
11280 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
11290 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
112a0 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
112b0 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
112c0 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
112d0 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
112e0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
112f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
11300 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
11310 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
11320 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
11330 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
11340 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
11350 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
11360 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
11370 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
11380 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
11390 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
113a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
113b0 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
113c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
113d0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
113e0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
113f0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
11400 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
11410 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
11420 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
11430 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
11440 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
11450 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
11460 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
11470 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
11480 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11490 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
114a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
114b0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
114c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
114d0 66 64 29 20 29 7b 0a 20 20 20 20 69 36 34 20 63  fd) ){.    i64 c
114e0 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
114f0 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  ize;.    /* TODO
11500 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
11510 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
11520 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
11530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11540 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
11550 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
11560 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
11570 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
11580 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ze*(i64)nPage;. 
11590 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
115a0 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
115b0 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
115c0 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
115d0 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
115e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
115f0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
11600 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
11610 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
11620 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
11630 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11640 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31  Pager->fd, "", 1
11650 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20  , newSize-1);.  
11660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11680 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
11690 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50  >dbFileSize = nP
116a0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
116b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
116c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
116d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
116e0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
116f0 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20  ze variable for 
11700 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67  the given.** pag
11710 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  er based on the 
11720 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
11730 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
11740 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74  e method.** of t
11750 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
11760 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f   file. The secto
11770 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75  r size will be u
11780 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20  sed used .** to 
11790 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
117a0 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
117b0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
117c0 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
117d0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
117e0 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
117f0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
11800 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
11810 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
11820 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
11830 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
11840 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
11850 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
11860 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
11870 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
11880 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
11890 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
118a0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
118b0 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
118c0 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
118d0 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
118e0 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
118f0 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
11900 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
11910 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
11920 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
11930 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74  CTOR_SIZE..*/.st
11940 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
11950 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
11960 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
11970 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
11980 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
11990 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
119a0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
119b0 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  File ){.    /* S
119c0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
119d0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
119e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
119f0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
11a00 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
11a10 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
11a20 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
11a30 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
11a40 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
11a50 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20  will segfault.. 
11a60 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
11a70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
11a80 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
11a90 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
11aa0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
11ab0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32 20  ->sectorSize<32 
11ac0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
11ad0 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
11ae0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
11af0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41  r->sectorSize>MA
11b00 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
11b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
11b20 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
11b30 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  2 );.    pPager-
11b40 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41  >sectorSize = MA
11b50 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
11b60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
11b70 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
11b80 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
11b90 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
11ba0 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
11bb0 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
11bc0 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
11bd0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
11be0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
11bf0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
11c00 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
11c10 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
11c20 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
11c30 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
11c40 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
11c50 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
11c60 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
11c70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
11c80 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
11c90 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
11ca0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
11cb0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
11cc0 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
11cd0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
11ce0 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
11cf0 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
11d00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
11d10 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
11d20 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
11d30 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
11d40 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
11d50 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
11d60 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
11d70 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
11d80 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
11d90 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
11da0 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
11db0 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
11dc0 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
11dd0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
11de0 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
11df0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
11e00 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
11e10 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
11e20 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
11e30 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
11e40 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
11e50 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
11e60 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
11e70 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
11e80 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37  age size..**  (7
11e90 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20  )  zero padding 
11ea0 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  out to the next 
11eb0 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20  sector size..** 
11ec0 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (8)  Zero or mo
11ed0 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
11ee0 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
11ef0 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
11f00 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
11f10 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
11f20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
11f30 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
11f40 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
11f50 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
11f60 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
11f70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
11f80 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
11f90 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69  an the first 7 i
11fa0 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
11fb0 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
11fc0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
11fd0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38  nstance of the 8
11fe0 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
11ff0 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
12000 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
12010 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
12020 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
12030 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
12040 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
12050 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
12060 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
12070 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
12080 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
12090 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
120a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
120b0 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
120c0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
120d0 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
120e0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
120f0 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
12100 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
12110 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
12120 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12130 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
12140 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
12150 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
12160 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
12170 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
12180 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
12190 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
121a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
121b0 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
121c0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
121d0 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
121e0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
121f0 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
12200 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
12210 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
12220 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
12230 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
12240 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
12250 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
12260 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
12270 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
12280 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
12290 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
122a0 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
122b0 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
122c0 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
122d0 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
122e0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
122f0 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
12300 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
12310 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
12320 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
12330 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
12340 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
12350 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
12360 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
12370 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
12380 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
12390 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
123a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
123b0 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
123c0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
123d0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
123e0 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
123f0 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
12400 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
12410 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
12420 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
12430 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
12440 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
12450 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
12460 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
12470 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
12480 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
12490 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
124a0 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
124b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
124c0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
124d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
124e0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
124f0 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
12500 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
12510 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
12520 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
12530 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
12540 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
12550 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
12560 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
12570 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
12580 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
12590 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
125a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
125b0 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
125c0 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
125d0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
125e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
125f0 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
12600 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
12610 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
12620 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
12630 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
12640 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
12650 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12660 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
12670 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
12680 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
12690 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
126a0 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
126b0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
126c0 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
126d0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
126e0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
126f0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
12700 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
12710 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12720 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
12730 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
12740 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12750 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
12760 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
12770 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
12780 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
12790 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
127a0 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
127b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
127c0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
127d0 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
127e0 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
127f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12800 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12810 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
12820 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
12830 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
12840 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
12850 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
12860 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
12870 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
12880 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
12890 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
128a0 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
128b0 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
128c0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
128d0 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
128e0 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
128f0 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
12900 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
12910 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
12920 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
12930 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
12940 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
12950 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
12960 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12970 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
12980 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  fd) );.  rc = sq
12990 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
129a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
129b0 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
129c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
129d0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
129e0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
129f0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
12a00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
12a10 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
12a20 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
12a30 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
12a40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12a50 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
12a60 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
12a70 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
12a80 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
12a90 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
12aa0 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
12ab0 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
12ac0 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
12ad0 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
12ae0 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
12af0 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
12b00 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
12b10 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
12b20 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
12b30 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
12b40 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
12b50 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
12b60 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
12b70 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
12b80 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
12b90 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
12ba0 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
12bb0 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50  nix.c,.  **  mxP
12bc0 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
12bd0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
12be0 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
12bf0 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
12c00 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
12c10 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
12c20 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
12c30 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
12c40 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
12c50 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
12c60 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
12c70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
12c80 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
12c90 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
12ca0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
12cb0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
12cc0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
12cd0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
12ce0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
12cf0 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
12d00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12d10 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
12d20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
12d30 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
12d40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
12d50 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
12d60 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
12d70 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
12d80 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
12d90 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
12da0 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
12db0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
12dc0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
12dd0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
12de0 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
12df0 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
12e00 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
12e10 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73   1 ){.    int is
12e20 55 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  Unsync = 0;..   
12e30 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
12e40 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
12e50 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
12e60 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
12e70 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
12e80 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
12e90 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
12ea0 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
12eb0 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
12ec0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
12ed0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
12ee0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
12ef0 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
12f00 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
12f10 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
12f20 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
12f30 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
12f40 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
12f50 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
12f60 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
12f70 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
12f80 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
12f90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
12fa0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12fb0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
12fc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12fd0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
12fe0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
12ff0 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
13000 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
13010 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
13020 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
13030 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
13040 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
13050 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
13060 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
13070 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
13080 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
13090 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
130a0 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
130b0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
130c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
130d0 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
130e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
130f0 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
13100 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
13110 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
13120 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
13130 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
13140 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13150 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
13160 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
13170 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
13180 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
13190 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
131a0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
131b0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
131c0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
131d0 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
131e0 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
131f0 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
13200 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
13210 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
13220 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
13230 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
13240 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
13250 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
13260 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
13270 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
13280 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
13290 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
132a0 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
132b0 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
132c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
132d0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
132e0 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
132f0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
13300 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13310 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
13320 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
13330 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
13340 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
13350 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
13360 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
13370 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
13380 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13390 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
133a0 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
133b0 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
133c0 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
133d0 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
133e0 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
133f0 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
13400 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
13410 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
13420 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
13430 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
13440 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
13450 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
13460 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
13470 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
13480 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
13490 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
134a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
134b0 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
134c0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
134d0 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
134e0 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
134f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
13500 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
13510 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
13520 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
13530 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
13540 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
13550 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
13560 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
13570 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
13580 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
13590 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
135a0 3b 0a 20 20 20 20 20 20 69 73 55 6e 73 79 6e 63  ;.      isUnsync
135b0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
135c0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
135d0 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
135e0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
135f0 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
13600 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
13610 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
13620 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
13630 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
13640 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13650 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
13660 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
13670 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
13680 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
13690 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
136a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
136b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
136c0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
136d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
136e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
136f0 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xPg;.    }..    
13700 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
13710 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
13720 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
13730 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  ck into the .   
13740 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13750 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61  e and/or page ca
13760 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  che..    */.    
13770 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b  for(u=0; u<nRec;
13780 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   u++){.      if(
13790 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
137a0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
137b0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
137c0 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65          needPage
137d0 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rReset = 0;.    
137e0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
137f0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
13800 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 31 2c  e_page(pPager,1,
13810 69 73 55 6e 73 79 6e 63 2c 26 70 50 61 67 65 72  isUnsync,&pPager
13820 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 30  ->journalOff,0,0
13830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13850 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13860 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
13870 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13880 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
13890 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
138a0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
138b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
138c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
138d0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
138e0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
138f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
13900 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
13910 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
13920 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
13930 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
13940 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
13950 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
13960 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
13970 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
13980 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
13990 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
139a0 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
139b0 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
139c0 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
139d0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
139e0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
139f0 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
13a00 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
13a10 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
13a20 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
13a30 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
13a40 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
13a50 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
13a60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13a70 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
13a80 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
13a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13aa0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
13ab0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
13ac0 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
13ad0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
13ae0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
13af0 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
13b00 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
13b10 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
13b20 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
13b30 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
13b40 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
13b50 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
13b60 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
13b70 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
13b80 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
13b90 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
13ba0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
13bb0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
13bc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
13bd0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
13be0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13bf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13c00 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
13c10 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
13c20 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
13c30 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
13c40 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
13c50 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
13c60 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
13c70 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
13c80 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
13c90 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
13ca0 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
13cb0 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
13cc0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
13cd0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
13ce0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
13cf0 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
13d00 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
13d10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
13d20 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
13d30 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ied..  */.  asse
13d40 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rt(.    pPager->
13d50 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20  fd->pMethods==0 
13d60 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ||.    sqlite3Os
13d70 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
13d80 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
13d90 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
13da0 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ,0)>=SQLITE_OK. 
13db0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
13dc0 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
13dd0 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
13de0 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
13df0 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
13e00 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
13e10 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
13e20 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
13e30 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
13e40 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
13e50 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
13e60 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
13e70 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
13e80 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
13e90 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
13ea0 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
13eb0 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
13ec0 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
13ed0 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
13ee0 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
13ef0 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
13f00 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
13f10 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
13f20 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
13f30 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
13f40 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
13f50 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
13f60 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
13f70 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
13f80 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
13f90 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
13fa0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
13fb0 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
13fc0 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
13fd0 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
13fe0 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
13ff0 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
14000 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
14010 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14020 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14030 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
14040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
14050 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
14060 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
14070 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
14080 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
14090 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
140a0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
140b0 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
140c0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
140d0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
140e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
140f0 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
14100 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
14110 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
14120 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
14130 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
14140 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
14150 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
14160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
14170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14180 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
14190 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
141a0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
141b0 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
141c0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
141d0 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
141e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
141f0 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
14200 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
14210 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
14220 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
14230 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
14240 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
14250 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
14260 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
14270 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
14280 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
14290 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
142a0 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
142b0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
142c0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
142d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
142e0 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
142f0 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
14300 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
14310 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
14320 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
14330 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
14340 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
14350 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
14360 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
14370 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
14380 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
14390 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
143a0 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
143b0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
143c0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
143d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
143e0 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
143f0 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
14400 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
14410 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
14420 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
14430 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
14440 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
14450 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
14460 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
14470 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
14480 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
14490 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
144a0 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
144b0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
144c0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
144d0 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
144e0 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
144f0 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
14500 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
14510 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
14520 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
14530 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
14540 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
14550 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
14560 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
14570 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
14580 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
14590 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
145a0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
145b0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
145c0 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
145d0 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
145e0 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
145f0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
14600 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
14610 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
14620 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
14630 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14640 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
14650 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14660 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
14670 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
14680 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14690 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
146a0 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
146b0 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
146c0 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
146d0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
146e0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
146f0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
14700 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
14710 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
14720 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
14730 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14740 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
14750 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
14760 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
14770 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14780 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
14790 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
147a0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
147b0 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
147c0 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
147d0 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
147e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
147f0 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
14800 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
14810 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
14820 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
14830 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
14840 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
14850 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
14860 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
14870 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
14880 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
14890 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
148a0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
148b0 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
148c0 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
148d0 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
148e0 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
148f0 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
14900 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
14910 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
14920 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
14930 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
14940 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14950 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
14960 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
14970 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
14980 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
14990 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
149a0 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
149b0 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
149c0 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
149d0 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
149e0 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
149f0 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
14a00 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
14a10 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
14a20 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
14a30 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
14a40 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
14a50 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
14a60 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
14a70 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
14a80 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
14a90 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
14aa0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
14ab0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
14ac0 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
14ad0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
14ae0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
14af0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
14b00 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
14b10 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
14b20 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
14b30 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
14b40 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
14b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
14b60 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
14b70 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
14b80 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
14b90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14ba0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
14bb0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
14bc0 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
14bd0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
14be0 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
14bf0 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
14c00 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
14c10 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
14c20 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
14c30 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14c40 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
14c50 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
14c60 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
14c70 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
14c80 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
14c90 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
14ca0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
14cb0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
14cc0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
14cd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14ce0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14cf0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
14d00 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
14d10 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
14d20 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
14d30 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
14d40 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
14d50 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
14d60 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
14d70 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
14d80 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
14d90 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
14da0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
14db0 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
14dc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
14dd0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
14de0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
14df0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
14e00 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
14e10 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
14e20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
14e30 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
14e40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
14e50 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
14e60 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14e70 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
14e80 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
14e90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
14ea0 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
14eb0 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
14ec0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14ed0 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ff;..  /* Begin 
14ee0 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
14ef0 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
14f00 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
14f10 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
14f20 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
14f30 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
14f40 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
14f50 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
14f60 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
14f70 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
14f80 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14f90 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
14fa0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
14fb0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
14fc0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
14fd0 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
14fe0 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
14ff0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
15000 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
15010 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
15020 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
15030 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
15040 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
15050 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
15060 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  t ){.    iHdrOff
15070 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
15080 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
15090 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
150a0 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
150b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
150c0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
150d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
150e0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
150f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15100 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
15110 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15120 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15130 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
15140 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
15150 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
15160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
15170 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15180 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
15190 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
151a0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
151b0 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
151c0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
151d0 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
151e0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
151f0 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
15200 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
15210 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
15220 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
15230 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
15240 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
15250 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
15260 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
15270 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
15280 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
15290 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
152a0 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
152b0 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
152c0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
152d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
152e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
152f0 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
15300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15310 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15320 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
15330 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
15340 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
15350 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
15360 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
15370 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
15380 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a  ger, 0, szJ, &nJ
15390 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
153a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
153b0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
153c0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
153d0 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
153e0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
153f0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
15400 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
15410 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
15420 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
15430 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
15440 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
15450 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
15460 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
15470 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
15480 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
15490 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
154a0 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26  JRec==0 .     &&
154b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
154c0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
154d0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
154e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
154f0 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65     ){.      nJRe
15500 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d  c = (u32)((szJ -
15510 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15520 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
15530 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
15540 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b   }.    for(ii=0;
15550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15560 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50  & ii<nJRec && pP
15570 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15580 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  <szJ; ii++){.   
15590 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
155a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
155b0 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70  pPager, 1, 0, &p
155c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
155d0 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
155e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
155f0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
15600 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
15610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
15620 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
15630 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff==szJ );..  
15640 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
15650 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
15660 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15670 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
15680 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
15690 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
156a0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
156b0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
156c0 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
156d0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
156e0 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
156f0 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
15700 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
15710 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
15720 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
15730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15740 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15750 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
15760 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
15770 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
15780 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72  geSize);.    for
15790 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
157a0 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
157b0 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
157c0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
157d0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
157e0 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34  t( offset==ii*(4
157f0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
15800 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
15810 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15820 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15830 20 30 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c 20   0, 0, &offset, 
15840 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d  1, pDone);.    }
15850 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
15860 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
15870 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
15880 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
15890 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
158a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
158b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
158c0 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72  f = szJ;.  }.  r
158d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
158e0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
158f0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
15900 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
15910 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
15920 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15930 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
15940 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15950 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
15960 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
15970 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
15980 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
15990 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ge);.}../*.** Ad
159a0 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
159b0 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
159c0 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
159d0 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
159e0 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
159f0 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
15a00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
15a10 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
15a20 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
15a30 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
15a40 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
15a50 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
15a60 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
15a70 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
15a80 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
15a90 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
15aa0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15ab0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
15ac0 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
15ad0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
15ae0 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
15af0 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
15b00 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
15b10 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
15b20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
15b30 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
15b40 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
15b50 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
15b60 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15b70 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
15b80 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
15b90 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
15ba0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
15bb0 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
15bc0 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
15bd0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
15be0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
15c00 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
15c10 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
15c20 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
15c30 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
15c40 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
15c50 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
15c60 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
15c70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
15c80 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
15c90 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
15ca0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
15cb0 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
15cc0 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
15cd0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
15ce0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
15cf0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15d00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
15d10 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
15d20 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
15d30 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
15d40 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
15d50 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
15d60 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
15d80 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
15d90 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
15da0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
15db0 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
15dc0 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
15dd0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
15de0 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
15df0 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
15e00 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
15e10 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
15e20 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
15e30 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
15e40 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
15e50 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
15e60 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
15e70 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
15e80 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
15e90 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
15ea0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15eb0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
15ec0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15ed0 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
15ee0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15ef0 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62  int level, int b
15f00 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50  FullFsync){.  pP
15f10 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
15f20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
15f30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
15f40 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
15f50 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
15f60 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
15f70 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
15f80 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
15f90 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
15fa0 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
15fb0 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
15fc0 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
15fd0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
15fe0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
15ff0 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
16000 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
16010 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
16020 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
16030 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
16040 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
16050 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
16060 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
16070 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
16080 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
16090 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
160a0 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
160b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
160c0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
160d0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
160e0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
160f0 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
16100 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69   file..**.** Wri
16110 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
16120 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69  riptor into *pFi
16130 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  le. Return SQLIT
16140 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
16150 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
16160 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
16170 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
16180 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
16190 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  ly .** delete th
161a0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
161b0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
161c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  ed..**.** The fl
161d0 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  ags passed to th
161e0 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65  e VFS layer xOpe
161f0 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f  n() call are tho
16200 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  se specified.** 
16210 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73  by parameter vfs
16220 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20  Flags ORed with 
16230 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
16240 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
16250 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a  OPEN_READWRITE.*
16260 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
16270 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20  N_CREATE.**     
16280 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
16290 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c  USIVE.**     SQL
162a0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
162b0 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63  NCLOSE.*/.static
162c0 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65   int pagerOpente
162d0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
162e0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
162f0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
16300 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16310 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
16320 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
16330 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
16340 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
16350 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
16360 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
16370 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
16380 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
16390 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
163a0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64  rn code */..#ifd
163b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
163c0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
163d0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
163e0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
163f0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
16400 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
16410 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
16420 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
16430 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16440 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
16450 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16460 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
16470 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
16480 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
16490 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
164a0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
164b0 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
164c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
164d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
164e0 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20  Open(pFile) );. 
164f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16500 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
16510 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
16520 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  on..**.** The pa
16530 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ger invokes the 
16540 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20  busy-handler if 
16550 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
16560 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
16570 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79  TE_BUSY when try
16580 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
16590 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61  rom no-lock to a
165a0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a   SHARED lock,.**
165b0 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20   or when trying 
165c0 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
165d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
165e0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
165f0 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65  .** lock. It doe
16600 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74  s *not* invoke t
16610 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
16620 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
16630 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f  rom.** SHARED to
16640 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68   RESERVED, or wh
16650 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
16660 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c  m SHARED to EXCL
16670 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20  USIVE.** (which 
16680 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f  occurs during ho
16690 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
166a0 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a  ck). Summary:.**
166b0 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e  .**   Transition
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65          | Invoke
166e0 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a  s xBusyHandler.*
166f0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
16700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
16730 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20    NO_LOCK       
16740 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  -> SHARED_LOCK  
16750 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53      | Yes.**   S
16760 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
16770 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
16780 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45   | No.**   SHARE
16790 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c  D_LOCK   -> EXCL
167a0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e  USIVE_LOCK   | N
167b0 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f  o.**   RESERVED_
167c0 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56  LOCK -> EXCLUSIV
167d0 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a  E_LOCK   | Yes.*
167e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79  *.** If the busy
167f0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
16800 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  k returns non-ze
16810 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ro, the lock is 
16820 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20  .** retried. If 
16830 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c  it returns zero,
16840 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   then the SQLITE
16850 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a  _BUSY error is.*
16860 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  * returned to th
16870 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20  e caller of the 
16880 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
16890 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
168a0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
168b0 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
168c0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
168e0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
168f0 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
16900 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
16910 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16920 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64  ter to busy-hand
16930 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ler function */.
16940 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e    void *pBusyHan
16950 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20  dlerArg         
16960 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
16970 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42  nt to pass to xB
16980 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b  usyHandler */.){
16990 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75    .  pPager->xBu
169a0 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
169b0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
169c0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
169d0 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
169e0 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erArg;.}../*.** 
169f0 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65  Report the curre
16a00 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  nt page size and
16a10 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
16a20 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a  ved bytes back.*
16a30 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a  * to the codec..
16a40 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16a50 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69  _HAS_CODEC.stati
16a60 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f  c void pagerRepo
16a70 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  rtSize(Pager *pP
16a80 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
16a90 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
16aa0 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65  hng ){.    pPage
16ab0 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
16ac0 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  g(pPager->pCodec
16ad0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16ae0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
16b00 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73  int)pPager->nRes
16b10 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  erve);.  }.}.#el
16b20 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
16b30 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20  rReportSize(X)  
16b40 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77     /* No-op if w
16b50 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
16b60 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64   a codec */.#end
16b70 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
16b80 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
16b90 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
16ba0 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
16bb0 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
16bc0 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
16bd0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
16be0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16bf0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
16c00 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
16c10 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
16c20 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
16c30 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
16c40 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
16c50 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
16c60 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
16c70 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
16c80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
16c90 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
16ca0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
16cb0 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
16cc0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
16cd0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
16ce0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
16cf0 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
16d00 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
16d10 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
16d20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
16d30 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
16d40 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
16d50 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
16d60 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
16d70 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
16d80 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
16d90 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
16da0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
16db0 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
16dc0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
16dd0 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
16de0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
16df0 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
16e00 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
16e10 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
16e20 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
16e30 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
16e40 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
16e50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
16e60 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
16e70 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
16e80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
16e90 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
16ea0 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
16eb0 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
16ec0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
16ed0 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
16ee0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
16ef0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
16f00 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
16f10 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
16f20 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
16f30 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
16f40 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
16f50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16f60 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
16f70 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
16f80 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
16f90 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
16fa0 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
16fb0 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
16fc0 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
16fd0 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
16fe0 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
16ff0 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
17000 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
17010 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
17020 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
17030 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
17040 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
17050 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
17060 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
17070 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
17080 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
170a0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
170b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
170c0 31 36 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69  16 *pPageSize, i
170d0 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20  nt nReserve){.  
170e0 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
170f0 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
17100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17110 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69  {.    u16 pageSi
17120 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b  ze = *pPageSize;
17130 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
17140 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
17150 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
17160 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
17170 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
17180 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
17190 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
171a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
171b0 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
171c0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
171d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
171e0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 61 67 65  =0 .     && page
171f0 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
17200 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
17210 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
17220 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63   char *pNew = (c
17230 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
17240 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65  eMalloc(pageSize
17250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  );.      if( !pN
17260 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ew ){.        rc
17270 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
17280 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17290 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
172a0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
172b0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
172c0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
172d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
172e0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
172f0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
17300 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
17310 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
17320 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
17330 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
17340 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
17350 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
17360 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50   }.    }.    *pP
17370 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
17380 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
17390 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
173a0 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
173b0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
173c0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
173d0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
173e0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
173f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
17400 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
17410 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
17420 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
17430 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17440 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17450 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17460 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
17470 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
17480 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
17490 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
174a0 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
174b0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
174c0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
174d0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
174e0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
174f0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
17500 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
17510 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
17520 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
17530 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
17540 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
17550 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
17560 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
17570 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
17580 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
17590 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
175a0 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
175b0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
175c0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
175d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
175e0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
175f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
17600 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
17610 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
17620 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
17630 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
17640 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
17650 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
17660 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
17670 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
17680 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
17690 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
176a0 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
176b0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
176c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
176d0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
176e0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
176f0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
17700 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
17710 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
17720 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
17730 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
17740 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
17750 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  ){.  int nPage;.
17760 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
17770 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
17780 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
17790 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65   }.  sqlite3Page
177a0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
177b0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73  r, &nPage);.  as
177c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
177d0 50 67 6e 6f 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Pgno>=nPage );. 
177e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
177f0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
17800 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
17810 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
17820 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
17830 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
17840 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
17850 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
17860 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
17870 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
17880 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
17890 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
178a0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
178b0 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
178c0 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
178d0 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
178e0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
178f0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
17900 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
17910 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
17920 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
17930 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17940 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
17950 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
17960 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
17970 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
17980 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
17990 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
179a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
179b0 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
179c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
179d0 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
179e0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
179f0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
17a00 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
17a10 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
17a20 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
17a30 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
17a40 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
17a50 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
17a60 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
17a70 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
17a80 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
17a90 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
17aa0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
17ab0 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
17ac0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
17ad0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
17ae0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
17af0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
17b00 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
17b10 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
17b20 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
17b30 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
17b40 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
17b50 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
17b60 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
17b70 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
17b80 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
17b90 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
17ba0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
17bb0 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
17bc0 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
17bd0 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
17be0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
17bf0 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
17c00 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
17c10 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
17c20 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
17c30 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
17c40 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
17c50 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
17c60 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
17c70 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
17c80 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
17c90 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
17ca0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
17cb0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
17cc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
17cd0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
17ce0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
17cf0 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
17d00 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
17d10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17d20 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
17d30 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
17d40 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
17d50 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
17d60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17d70 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
17d80 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
17d90 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
17da0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
17db0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
17dc0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
17dd0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
17de0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
17df0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
17e00 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
17e10 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
17e20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
17e30 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
17e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
17e50 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
17e60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
17e70 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
17e80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17e90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17ea0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
17eb0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
17ec0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
17ed0 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68  ociated .** with
17ee0 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c   pPager. Normall
17ef0 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75  y, this is calcu
17f00 6c 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69  lated as (<db fi
17f10 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73  le size>/<page-s
17f20 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65  ize>)..** Howeve
17f30 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  r, if the file i
17f40 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
17f50 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65  <page-size> byte
17f60 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
17f70 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73  .** this is cons
17f80 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20  idered a 1 page 
17f90 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
17fa0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
17fb0 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
17fc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17fd0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
17fe0 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65  e.** error state
17ff0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
18000 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
18010 61 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67  age left unchang
18020 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68  ed. Or,.** if th
18030 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61  e file system ha
18040 73 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20  s to be queried 
18050 66 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20  for the size of 
18060 74 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20  the file and.** 
18070 74 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70  the query attemp
18080 74 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20  t returns an IO 
18090 65 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72  error, the IO er
180a0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
180b0 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50  rned.** and *pnP
180c0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
180d0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  anged..**.** Oth
180e0 65 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79  erwise, if every
180f0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
18100 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ful, then SQLITE
18110 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
18120 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
18130 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
18140 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18150 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
18160 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
18170 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
18180 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
18190 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e  nPage){.  Pgno n
181a0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
181b0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
181c0 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
181d0 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 65 74 65  ge */..  /* Dete
181e0 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
181f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18200 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
18210 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
18220 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
18230 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
18240 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
18250 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
18260 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18280 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
18290 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
182a0 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
182c0 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
182d0 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
182e0 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
182f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
18300 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18310 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18320 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
18330 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
18340 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
18350 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
18360 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
18370 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61  n))) ){.      pa
18380 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
18390 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
183a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
183b0 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
183c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
183d0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
183e0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
183f0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67       nPage = (Pg
18400 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
18410 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
18420 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18430 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
18440 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
18450 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
18460 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
18470 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
18480 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50   nPage;.      pP
18490 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
184a0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
184b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
184c0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
184d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
184e0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
184f0 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66  n the .  ** conf
18500 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
18510 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
18520 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
18530 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
18540 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
18550 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
18560 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
18570 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
18580 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
18590 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
185a0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
185b0 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
185c0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
185d0 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 2a 70 6e 50  ITE_OK */.  *pnP
185e0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
185f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18600 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
18610 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
18620 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
18630 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18640 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
18650 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
18660 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
18670 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
18680 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18690 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
186a0 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
186b0 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
186c0 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
186d0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
186e0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
186f0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
18700 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
18710 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
18720 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
18730 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
18740 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
18750 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
18760 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
18770 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
18780 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
18790 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
187a0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
187b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
187c0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
187d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
187e0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
187f0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
18800 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
18810 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
18820 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
18830 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
18840 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
18850 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
18860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18870 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
18880 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
18890 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
188a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
188b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
188d0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
188e0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
188f0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
18900 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
18910 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
18920 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
18930 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
18940 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
18950 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
18960 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
18970 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
18980 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
18990 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
189a0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
189b0 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
189c0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
189d0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
189e0 77 6e 2e 20 49 74 0a 20 20 2a 2a 20 6d 75 73 74  wn. It.  ** must
189f0 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6d   not have been m
18a00 6f 64 69 66 69 65 64 20 61 74 20 74 68 69 73 20  odified at this 
18a10 70 6f 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  point..  */.  as
18a20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18a30 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
18a40 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
18a50 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20  izeValid==0 );. 
18a60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18a70 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
18a80 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
18a90 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 29 3b  dbModified==0 );
18aa0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
18ab0 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
18ac0 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
18ad0 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
18ae0 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
18af0 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f  ready held, or o
18b00 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
18b10 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  stions that the 
18b20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
18b30 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
18b40 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
18b50 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
18b60 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
18b70 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
18b80 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
18b90 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
18ba0 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
18bb0 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
18bc0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
18bd0 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f  GER_UNLOCK && lo
18be0 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48  cktype==PAGER_SH
18bf0 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
18c00 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
18c10 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26  PAGER_RESERVED &
18c20 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45  & locktype==PAGE
18c30 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29  R_EXCLUSIVE).  )
18c40 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
18c50 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
18c60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
18c70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
18c80 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
18c90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
18ca0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
18cb0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
18cc0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
18cd0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
18ce0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
18cf0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
18d00 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66  erArg) );.    if
18d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18d20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
18d30 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63  >state = (u8)loc
18d40 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
18d50 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
18d60 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
18d70 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
18d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18d90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
18da0 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
18db0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
18dc0 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
18dd0 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
18de0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
18df0 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
18e00 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
18e10 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
18e20 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
18e30 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
18e40 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
18e50 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
18e60 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
18e70 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
18e80 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
18e90 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
18ea0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
18eb0 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
18ec0 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
18ed0 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
18ee0 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
18ef0 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
18f00 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
18f10 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
18f20 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
18f30 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
18f40 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
18f50 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
18f60 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
18f70 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
18f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
18f90 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
18fa0 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
18fb0 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
18fc0 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
18fd0 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
18fe0 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
18ff0 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
19000 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
19010 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
19020 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
19030 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19040 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
19050 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
19060 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
19070 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
19080 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
19090 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75 72  orrect behaviour
190a0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
190b0 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
190c0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
190d0 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
190e0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
190f0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
19100 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
19110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19120 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
19130 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
19140 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
19150 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
19160 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
19170 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
19180 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
19190 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
191a0 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
191b0 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
191c0 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
191d0 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
191e0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
191f0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
19200 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
19210 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
19220 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
19230 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
19240 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
19250 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
19260 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
19270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
19280 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
19290 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
192a0 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
192b0 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
192c0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
192d0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
192e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
192f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
19300 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
19310 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
19320 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
19330 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
19340 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
19350 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
19360 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
19370 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
19380 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
19390 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
193a0 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
193b0 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
193c0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
193d0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
193e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
193f0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
19400 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
19410 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
19420 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
19430 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
19440 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
19450 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
19460 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
19470 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
19480 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
19490 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
194a0 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
194b0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
194c0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
194d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
194e0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
194f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
19500 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
19510 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19520 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19530 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
19540 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
19550 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
19560 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
19570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
19580 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
19590 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
195a0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
195b0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
195c0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
195d0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
195e0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
195f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
19600 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
19610 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
19620 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
19630 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
19640 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
19650 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
19660 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
19670 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
19680 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
19690 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
196a0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
196b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
196c0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
196d0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
196e0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
196f0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
19700 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
19710 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
19720 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
19730 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
19740 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
19750 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
19760 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
19770 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
19780 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
19790 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
197a0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
197b0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
197c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
197d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
197e0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
197f0 50 61 67 65 72 29 7b 0a 20 20 64 69 73 61 62 6c  Pager){.  disabl
19800 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
19810 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
19820 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
19830 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d  loc();.  pPager-
19840 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20  >errCode = 0;.  
19850 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
19860 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67  eMode = 0;.  pag
19870 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
19880 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
19890 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
198a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
198b0 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50  se{.    /* Set P
198c0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20  ager.journalHdr 
198d0 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65  to -1 for the be
198e0 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61 67  nefit of the pag
198f0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20  er_playback() . 
19900 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68     ** call which
19910 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f   may be made fro
19920 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e  m within pagerUn
19930 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
19940 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20  ). If it.    ** 
19950 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20  is not -1, then 
19960 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72  the unsynced por
19970 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20  tion of an open 
19980 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
19990 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65  .    ** be playe
199a0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
199b0 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
199c0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
199d0 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  urs while.    **
199e0 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
199f0 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
19a00 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72   may become corr
19a10 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  upt..    */.    
19a20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
19a30 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70 61 67  dr = -1;.    pag
19a40 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
19a50 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
19a60 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
19a70 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65  ignMalloc();.  e
19a80 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
19a90 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50  io_errors();.  P
19aa0 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53  AGERTRACE(("CLOS
19ab0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
19ac0 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f  (pPager)));.  IO
19ad0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70  TRACE(("CLOSE %p
19ae0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
19af0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
19b00 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71  Pager->fd);.  sq
19b10 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
19b20 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
19b30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
19b40 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
19b50 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
19b60 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
19b70 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
19b80 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
19b90 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
19ba0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
19bb0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
19bc0 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
19bd0 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
19be0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
19bf0 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
19c00 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
19c10 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
19c20 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
19c30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
19c40 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
19c50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
19c60 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
19c70 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
19c80 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
19c90 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
19ca0 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
19cb0 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
19cc0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
19cd0 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
19ce0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
19cf0 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
19d00 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
19d10 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
19d20 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
19d30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19d40 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
19d50 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
19d60 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
19d70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
19d80 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
19d90 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
19da0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
19db0 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
19dc0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
19dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
19de0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
19df0 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
19e00 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
19e10 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
19e20 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
19e30 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
19e40 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
19e50 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
19e60 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74  Sync flag is not
19e70 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
19e80 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a  function is a.**
19e90 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
19ea0 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
19eb0 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
19ec0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
19ed0 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65  de.** and the de
19ee0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
19ef0 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20  tics of the the 
19f00 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20  file-system, as 
19f10 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
19f20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
19f30 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d  l file is an in-
19f40 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
19f50 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e  ile, no action n
19f60 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61  eed.**     be ta
19f70 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f  ken..**.**   * O
19f80 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
19f90 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
19fa0 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46   support the SAF
19fb0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
19fc0 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74  y,.**     then t
19fd0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
19fe0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
19ff0 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
1a000 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  al header.**    
1a010 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63   is updated to c
1a020 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65  ontain the numbe
1a030 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63  r of journal rec
1a040 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ords that have.*
1a050 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74  *     been writt
1a060 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e  en following it.
1a070 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1a080 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75   operating in fu
1a090 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d  ll-sync.**     m
1a0a0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
1a0b0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1a0c0 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nced before this
1a0d0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
1a0e0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  d..**.**   * If 
1a0f0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
1a100 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
1a110 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65  SEQUENTIAL prope
1a120 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20  rty, then .**   
1a130 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
1a140 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  s synced..**.** 
1a150 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f  Or, in pseudo-co
1a160 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  de:.**.**   if( 
1a170 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a  NOT <in-memory j
1a180 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20  ournal> ){.**   
1a190 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41    if( NOT SAFE_A
1a1a0 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20  PPEND ){.**     
1a1b0 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63    if( <full-sync
1a1c0 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c   mode> ) xSync(<
1a1d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
1a1e0 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65  **       <update
1a1f0 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20   nRec field>.** 
1a200 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66      } .**     if
1a210 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c  ( NOT SEQUENTIAL
1a220 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1a230 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d  l file>);.**   }
1a240 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
1a250 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
1a260 73 20 6e 65 76 65 72 20 62 65 20 73 65 74 20 66  s never be set f
1a270 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1a280 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69  es, or any.** fi
1a290 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  le operating in 
1a2a0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61  no-sync mode (Pa
1a2b0 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74  ger.noSync set t
1a2c0 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a  o non-zero)..**.
1a2d0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1a2e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
1a2f0 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
1a300 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
1a310 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
1a320 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1a330 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
1a340 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
1a350 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
1a360 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
1a370 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
1a380 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1a390 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1a3a0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1a3b0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
1a3c0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1a3d0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
1a3e0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1a3f0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1a400 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1a410 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1a420 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
1a430 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
1a440 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  MORY ){.      in
1a450 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a470 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1a480 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
1a490 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1a4a0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1a4b0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1a4c0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
1a4d0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1a4e0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20  er->jfd) );..   
1a4f0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
1a500 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1a510 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
1a520 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
1a530 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
1a540 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
1a550 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
1a560 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
1a570 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
1a580 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1a590 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
1a5a0 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
1a5b0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
1a5c0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1a5d0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
1a5e0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
1a5f0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
1a600 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
1a610 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
1a620 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
1a630 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
1a640 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1a650 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
1a660 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
1a670 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
1a680 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
1a690 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
1a6a0 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  us connections t
1a6b0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
1a6c0 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
1a6d0 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
1a6e0 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
1a6f0 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
1a700 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
1a710 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
1a720 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
1a730 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
1a740 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1a750 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
1a760 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
1a770 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1a780 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
1a790 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
1a7a0 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
1a7b0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
1a7c0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
1a7d0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
1a7e0 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
1a7f0 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
1a800 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1a810 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
1a820 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
1a830 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
1a840 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
1a850 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
1a860 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
1a870 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
1a880 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
1a890 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1a8a0 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
1a8b0 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
1a8c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
1a8d0 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
1a8e0 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
1a8f0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
1a900 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
1a910 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
1a920 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
1a930 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
1a940 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
1a950 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
1a960 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
1a970 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
1a980 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
1a990 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
1a9a0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1a9b0 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
1a9c0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
1a9d0 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
1a9e0 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
1a9f0 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
1aa00 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
1aa10 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
1aa20 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
1aa30 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
1aa40 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
1aa50 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
1aa60 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
1aa70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
1aa80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1aa90 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
1aaa0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
1aab0 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 09 75 38 20   aMagic[8];..u8 
1aac0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
1aad0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
1aae0 3b 0a 0a 09 6d 65 6d 63 70 79 28 7a 48 65 61 64  ;...memcpy(zHead
1aaf0 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
1ab00 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
1ab10 61 6c 4d 61 67 69 63 29 29 3b 0a 09 70 75 74 33  alMagic));..put3
1ab20 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
1ab30 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1ab40 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
1ab50 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
1ab60 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
1ab70 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
1ab80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1ab90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1aba0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
1abb0 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
1abc0 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
1abd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1abe0 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
1abf0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
1ac00 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
1ac10 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
1ac20 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
1ac30 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
1ac40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ac50 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1ac60 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
1ac70 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
1ac80 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1ac90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1aca0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1acb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1acc0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1acd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ace0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1acf0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
1ad00 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
1ad10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ad20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
1ad30 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
1ad40 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
1ad50 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
1ad60 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
1ad70 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
1ad80 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
1ad90 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
1ada0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
1adb0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
1adc0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
1add0 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
1ade0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
1adf0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ae00 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
1ae10 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
1ae20 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
1ae30 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
1ae40 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
1ae50 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
1ae60 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
1ae70 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
1ae80 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
1ae90 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
1aea0 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
1aeb0 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
1aec0 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
1aed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
1aee0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
1aef0 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
1af00 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1af10 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
1af20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
1af30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1af40 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
1af50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1af60 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
1af70 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1af80 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1af90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1afa0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1afb0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1afc0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1afd0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
1afe0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
1aff0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
1b000 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1b010 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1b020 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1b030 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
1b040 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1b050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b060 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1b070 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
1b080 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
1b090 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
1b0a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
1b0b0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1b0c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1b0e0 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
1b0f0 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
1b100 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
1b110 61 6c 48 64 72 0a 09 29 3b 0a 20 20 20 20 20 20  alHdr..);.      
1b120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b130 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1b150 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1b160 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1b170 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50  AL) ){.        P
1b180 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
1b190 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
1b1a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1b1b0 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  r)));.        IO
1b1c0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
1b1d0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
1b1e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b1f0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1b200 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1b210 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
1b220 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
1b230 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
1b240 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
1b250 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
1b260 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
1b270 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b280 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b290 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b2a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a   }..    /* The j
1b2b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
1b2c0 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c  just successfull
1b2d0 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61  y synced. Set Pa
1b2e0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  ger.needSync .  
1b2f0 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64    ** to zero and
1b300 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
1b310 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1b320 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20  on all pagess.. 
1b330 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1b340 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1b350 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b360 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
1b370 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1b380 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
1b390 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1b3a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1b3b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1b3c0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
1b3d0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 6e   is the first in
1b3e0 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
1b3f0 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63 6f  f dirty pages co
1b400 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68  nnected.** by th
1b410 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
1b420 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ointer. This fun
1b430 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63  ction writes eac
1b440 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20  h one of the.** 
1b450 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
1b460 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74  in the list to t
1b470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b480 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  . The argument m
1b490 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72  ay.** be NULL, r
1b4a0 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65  epresenting an e
1b4b0 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68  mpty list. In th
1b4c0 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e  is case this fun
1b4d0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f  ction is.** a no
1b4e0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  -op..**.** The p
1b4f0 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ager must hold a
1b500 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
1b510 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69  ED lock when thi
1b520 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
1b530 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20   called. Before 
1b540 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67  writing anything
1b550 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1b560 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b   file, this lock
1b570 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64 20  .** is upgraded 
1b580 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
1b590 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63  lock. If the loc
1b5a0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
1b5b0 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ined,.** SQLITE_
1b5c0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
1b5d0 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20   and no data is 
1b5e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
1b5f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1b600 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65   .** If the page
1b610 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  r is a temp-file
1b620 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20 61   pager and the a
1b630 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65  ctual file-syste
1b640 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74  m file.** is not
1b650 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   yet open, it is
1b660 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65   created and ope
1b670 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  ned before any d
1b680 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ata is .** writt
1b690 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  en out..**.** On
1b6a0 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  ce the lock has 
1b6b0 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e  been upgraded an
1b6c0 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c  d, if necessary,
1b6d0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
1b6e0 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61  ,.** the pages a
1b6f0 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  re written out t
1b700 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b710 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65  ile in list orde
1b720 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20  r. Writing.** a 
1b730 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64 20  page is skipped 
1b740 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74 68  if it meets eith
1b750 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  er of the follow
1b760 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a  ing criteria:.**
1b770 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
1b780 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
1b790 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  er than Pager.db
1b7a0 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  Size, or.**   * 
1b7b0 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  The PGHDR_DONT_W
1b7c0 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  RITE flag is set
1b7d0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
1b7e0 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f  .** If writing o
1b7f0 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65 73  ut a page causes
1b800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b810 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65  le to grow, Page
1b820 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20  r.dbFileSize.** 
1b830 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
1b840 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20  dingly. If page 
1b850 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74  1 is written out
1b860 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1b870 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61   cached.** in Pa
1b880 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1b890 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
1b8a0 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c  atch the new val
1b8b0 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
1b8c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b8d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
1b8e0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
1b8f0 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
1b900 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1b910 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
1b920 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72  occurs, an IO er
1b930 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b940 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65  rned. Or, if the
1b950 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1b960 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74  cannot.** be obt
1b970 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55  ained, SQLITE_BU
1b980 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  SY is returned..
1b990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b9a0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1b9b0 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
1b9c0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1b9d0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
1b9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1b9f0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
1ba00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ba30 65 20 2a 2f 0a 0a 20 20 69 66 28 20 4e 45 56 45  e */..  if( NEVE
1ba40 52 28 70 4c 69 73 74 3d 3d 30 29 20 29 20 72 65  R(pList==0) ) re
1ba50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ba60 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
1ba70 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
1ba80 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1ba90 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
1baa0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
1bab0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1bac0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
1bad0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1bae0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
1baf0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
1bb00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
1bb10 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f   ** call is a no
1bb20 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  -op..  **.  ** M
1bb30 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66  oving the lock f
1bb40 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20  rom RESERVED to 
1bb50 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c  EXCLUSIVE actual
1bb60 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e  ly involves goin
1bb70 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  g.  ** through a
1bb80 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  n intermediate s
1bb90 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20  tate PENDING.   
1bba0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70  A PENDING lock p
1bbb0 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a  revents new.  **
1bbc0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74   readers from at
1bbd0 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64  taching to the d
1bbe0 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75  atabase but is u
1bbf0 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20  nsufficient for 
1bc00 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65  us to.  ** write
1bc10 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61  .  The idea of a
1bc20 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
1bc30 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20   to prevent new 
1bc40 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a  readers from.  *
1bc50 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c  * coming in whil
1bc60 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78  e we wait for ex
1bc70 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74  isting readers t
1bc80 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20  o clear..  **.  
1bc90 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  ** While the pag
1bca0 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53  er is in the RES
1bcb0 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
1bcc0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
1bcd0 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  se file.  ** is 
1bce0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65  unchanged and we
1bcf0 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69   can rollback wi
1bd00 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1bd10 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a  playback the.  *
1bd20 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  * journal into t
1bd30 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1bd40 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65  base file.  Once
1bd50 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74   we transition t
1bd60 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  o.  ** EXCLUSIVE
1bd70 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64  , it means the d
1bd80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
1bd90 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e   been changed an
1bda0 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20  d any rollback. 
1bdb0 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65   ** will require
1bdc0 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62   a journal playb
1bdd0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ack..  */.  asse
1bde0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1bdf0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1be00 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  D );.  rc = page
1be10 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
1be20 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
1be30 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66  _LOCK);..  /* If
1be40 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
1be50 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
1be60 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
1be70 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
1be80 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
1be90 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
1bea0 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
1beb0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
1bec0 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
1bed0 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
1bee0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
1bef0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
1bf00 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
1bf10 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
1bf20 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1bf30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1bf40 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
1bf50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
1bf60 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
1bf70 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
1bf80 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
1bf90 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
1bfa0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1bfb0 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
1bfc0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1bfd0 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
1bfe0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1bff0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
1c000 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1c010 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
1c020 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
1c030 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
1c040 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
1c050 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
1c060 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
1c070 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
1c080 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
1c090 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
1c0a0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
1c0b0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
1c0c0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
1c0d0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
1c0e0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1c0f0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
1c100 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
1c110 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
1c120 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
1c130 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
1c140 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
1c150 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
1c160 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
1c170 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
1c180 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
1c190 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
1c1a0 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
1c1b0 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
1c1c0 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
1c1d0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1c1e0 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66  ageSize;   /* Of
1c1f0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
1c200 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
1c210 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f        /* Data to
1c240 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20   write */    .. 
1c250 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
1c260 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
1c270 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
1c280 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
1c290 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
1c2a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
1c2b0 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
1c2c0 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
1c2d0 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
1c2e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c2f0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1c300 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
1c310 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
1c320 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
1c330 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
1c340 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
1c350 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
1c360 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
1c370 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1c380 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
1c390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c3a0 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
1c3b0 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
1c3c0 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
1c3d0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1c3e0 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
1c3f0 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
1c400 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
1c410 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1c420 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1c430 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
1c440 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
1c450 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1c460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c470 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
1c480 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
1c490 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c4a0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
1c4b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1c4c0 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
1c4d0 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
1c4e0 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
1c4f0 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
1c500 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1c510 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1c520 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1c530 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
1c540 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
1c550 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
1c560 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
1c570 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c590 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c5a0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1c5b0 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
1c5c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1c5d0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
1c5e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1c5f0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1c600 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
1c610 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
1c620 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1c630 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
1c640 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c650 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
1c660 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
1c670 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c680 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
1c690 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1c6a0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1c6b0 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
1c6c0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1c6d0 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
1c6e0 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
1c6f0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1c700 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c710 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1c720 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
1c730 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1c740 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
1c750 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
1c760 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
1c770 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
1c780 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
1c790 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
1c7a0 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
1c7b0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
1c7c0 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
1c7d0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
1c7e0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
1c7f0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1c800 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
1c810 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
1c820 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
1c830 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
1c840 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
1c850 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1c860 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
1c870 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1c880 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
1c890 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
1c8a0 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
1c8b0 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
1c8c0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
1c8d0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
1c8e0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
1c8f0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
1c900 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
1c910 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
1c920 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
1c930 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
1c940 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
1c950 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
1c960 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1c970 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1c980 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1c990 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f  Pager;.  if( isO
1c9a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
1c9b0 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ) ){.    void *p
1c9c0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
1c9d0 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  a;.    i64 offse
1c9e0 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  t = pPager->nSub
1c9f0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
1ca00 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68  ageSize);.    ch
1ca10 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
1ca20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1ca30 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1ca40 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
1ca50 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32  TE_NOMEM, pData2
1ca60 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  );.    PAGERTRAC
1ca70 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E(("STMT-JOURNAL
1ca80 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1ca90 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1caa0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1cab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
1cac0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
1cad0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
1cae0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
1caf0 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  );.    rc = writ
1cb00 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
1cb10 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
1cb20 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
1cb30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cb40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1cb50 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1cb60 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
1cb70 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1cb80 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
1cb90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1cba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cbb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
1cbc0 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
1cbd0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
1cbe0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
1cbf0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
1cc00 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
1cc10 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
1cc20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cc30 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1cc40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1cc50 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
1cc60 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
1cc70 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
1cc80 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
1cc90 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
1cca0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1ccb0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
1ccc0 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
1ccd0 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
1cce0 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
1ccf0 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
1cd00 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
1cd10 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
1cd20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1cd30 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
1cd40 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
1cd50 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
1cd60 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
1cd70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1cd80 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
1cd90 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
1cda0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1cdb0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
1cdc0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1cdd0 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
1cde0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
1cdf0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1ce00 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
1ce10 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
1ce20 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
1ce30 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1ce40 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
1ce50 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
1ce60 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
1ce70 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
1ce80 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
1ce90 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
1cea0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1ceb0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
1cec0 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
1ced0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
1cee0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1cef0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1cf00 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
1cf10 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
1cf20 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
1cf30 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1cf40 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
1cf50 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
1cf60 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
1cf70 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
1cf80 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1cf90 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
1cfa0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1cfb0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
1cfc0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1cfd0 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
1cfe0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1cff0 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
1d000 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1d010 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1d020 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
1d030 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d040 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1d050 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
1d060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1d070 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1d080 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
1d090 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69  doNotSync flag i
1d0a0 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71 6c  s set by the sql
1d0b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1d0c0 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
1d0d0 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e  it.  ** is journ
1d0e0 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66 20  alling a set of 
1d0f0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74 61  two or more data
1d100 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74 20  base pages that 
1d110 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20  are stored.  ** 
1d120 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b  on the same disk
1d130 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67   sector. Syncing
1d140 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1d150 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c  not allowed whil
1d160 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68  e.  ** this is h
1d170 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
1d180 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1d190 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
1d1a0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74 20  such a.  ** set 
1d1b0 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e  of pages are syn
1d1c0 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65  ced to disk toge
1d1d0 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65  ther. So, if the
1d1e0 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74   page this funct
1d1f0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79 69  ion.  ** is tryi
1d200 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e  ng to make clean
1d210 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1d220 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64  journal sync and
1d230 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20   the doNotSync. 
1d240 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
1d250 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1d260 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
1d270 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  The pcache layer
1d280 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20   will.  ** just 
1d290 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64  have to go ahead
1d2a0 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1d2b0 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20  new page buffer 
1d2c0 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20  instead of.  ** 
1d2d0 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a  reusing pPg..  *
1d2e0 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79  *.  ** Similarly
1d2f0 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68  , if the pager h
1d300 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
1d310 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
1d320 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20  te, do not.  ** 
1d330 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
1d340 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
1d350 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   to disk..  */. 
1d360 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
1d370 72 2d 3e 65 72 72 43 6f 64 65 29 0a 20 20 20 7c  r->errCode).   |
1d380 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  | (pPager->doNot
1d390 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61  Sync && pPg->fla
1d3a0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1d3b0 4e 43 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  NC).  ){.    ret
1d3c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d3d0 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68   }..  /* Sync th
1d3e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1d3f0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
1d400 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
1d410 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
1d420 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63  ){.    rc = sync
1d430 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1d440 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d450 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1d460 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20  ->fullSync && . 
1d470 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a       !(pPager->j
1d480 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1d490 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
1d4a0 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 21  MORY) &&.      !
1d4b0 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
1d4c0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1d4d0 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
1d4e0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1d4f0 50 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20 20 20  PEND).    ){.   
1d500 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
1d510 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1d520 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1d530 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1d540 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1d550 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1d560 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67  his page is larg
1d570 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
1d580 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  ent size of.  **
1d590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d5a0 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
1d5b0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
1d5c0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1d5d0 6c 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  l..  ** This is 
1d5e0 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
1d5f0 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
1d600 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
1d610 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61   will not.  ** a
1d620 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61  ctually write da
1d630 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69  ta to the file i
1d640 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
1d650 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20  *.  ** Consider 
1d660 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
1d670 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73  quence of events
1d680 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45  :.  **.  **   BE
1d690 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a  GIN;.  **     <j
1d6a0 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20  ournal page X>. 
1d6b0 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
1d6c0 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20  page X>.  **    
1d6d0 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
1d6e0 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e   **       <shrin
1d6f0 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
1d700 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 2a 2a  to Y pages>.  **
1d710 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65         pagerStre
1d720 73 73 28 70 61 67 65 20 58 29 0a 20 20 2a 2a 20  ss(page X).  ** 
1d730 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
1d740 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  sp;.  **.  ** If
1d750 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65   (X>Y), then whe
1d760 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73  n pagerStress is
1d770 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77   called page X w
1d780 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
1d790 65 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74  en.  ** out to t
1d7a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d7b0 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72  , but will be dr
1d7c0 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  opped from the c
1d7d0 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a  ache. Then,.  **
1d7e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
1d7f0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
1d800 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
1d810 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
1d820 65 61 64 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ead.  ** data fr
1d830 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1d840 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
1d850 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
1d860 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 2a 2a  age X as it.  **
1d870 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72   was when the tr
1d880 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1d890 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73  d, not as it was
1d8a0 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54   when "SAVEPOINT
1d8b0 20 73 70 22 0a 20 20 2a 2a 20 77 61 73 20 65 78   sp".  ** was ex
1d8c0 65 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  ecuted..  **.  *
1d8d0 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
1d8e0 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  s to write the c
1d8f0 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20  urrent data for 
1d900 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20  page X into the 
1d910 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  .  ** sub-journa
1d920 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69  l file now (if i
1d930 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1d940 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74   there), so that
1d950 20 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65   it will.  ** be
1d960 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1d970 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77   current value w
1d980 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
1d990 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 2a  K TO sp" is .  *
1d9a0 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f  * executed..  */
1d9b0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20  .  if( NEVER(.  
1d9c0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
1d9d0 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
1d9e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
1d9f0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1da00 65 28 70 50 67 29 0a 20 20 29 20 29 7b 0a 20 20  e(pPg).  ) ){.  
1da10 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
1da20 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lPage(pPg);.  }.
1da30 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
1da40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1da50 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
1da60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
1da70 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1da80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 67  TE_OK ){.    pPg
1da90 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1daa0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1dab0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
1dac0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  ;.  }..  /* Mark
1dad0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
1dae0 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
1daf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1db00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1db10 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
1db20 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1db30 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1db40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
1db50 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
1db60 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
1db70 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1db80 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f  ager, rc);.}.../
1db90 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
1dba0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
1dbb0 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
1dbc0 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
1dbd0 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
1dbe0 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
1dbf0 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
1dc00 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
1dc10 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
1dc20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
1dc30 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
1dc40 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
1dc50 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
1dc60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1dc70 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
1dc80 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
1dc90 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
1dca0 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
1dcb0 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
1dcc0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
1dcd0 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
1dce0 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
1dcf0 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
1dd00 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
1dd10 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
1dd20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
1dd30 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
1dd40 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
1dd50 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
1dd60 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
1dd70 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
1dd80 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
1dd90 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
1dda0 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
1ddb0 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
1ddc0 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
1ddd0 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
1dde0 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
1ddf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1de00 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
1de10 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
1de20 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
1de30 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
1de40 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
1de50 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
1de60 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
1de70 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
1de80 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ) API..**.** The
1de90 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
1dea0 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69  is used to speci
1deb0 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68  fy properties th
1dec0 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a  at affect the.**
1ded0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
1dee0 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75  e pager. It shou
1def0 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d  ld be passed som
1df00 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e  e bitwise combin
1df10 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ation.** of the 
1df20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
1df30 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f  AL and PAGER_NO_
1df40 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a  READLOCK flags..
1df50 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
1df60 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
1df70 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
1df80 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
1df90 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
1dfa0 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
1dfb0 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
1dfc0 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
1dfd0 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
1dfe0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
1dff0 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
1e000 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
1e010 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
1e020 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
1e030 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1e040 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
1e050 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
1e060 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
1e070 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
1e080 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e090 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
1e0a0 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
1e0b0 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
1e0c0 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
1e0d0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
1e0e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
1e0f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
1e100 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
1e110 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
1e120 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
1e130 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
1e140 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
1e150 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e160 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
1e170 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1e180 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
1e190 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
1e1a0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
1e1b0 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
1e1c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
1e1d0 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
1e1e0 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
1e1f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e200 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
1e210 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1e220 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
1e230 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1e240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e250 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
1e260 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
1e270 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
1e280 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
1e290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
1e2a0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
1e2b0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
1e2c0 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
1e2d0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
1e2e0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
1e2f0 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
1e300 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
1e310 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
1e320 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
1e330 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
1e340 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
1e350 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
1e360 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
1e370 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
1e380 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
1e390 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
1e3a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e3b0 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
1e3c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1e3d0 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
1e3e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1e3f0 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
1e400 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
1e410 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
1e420 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
1e430 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1e440 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1e450 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
1e460 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
1e470 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e480 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
1e490 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
1e4a0 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
1e4b0 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
1e4c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
1e4d0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
1e4e0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
1e4f0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
1e500 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
1e510 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1e520 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
1e530 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
1e540 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1e550 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
1e560 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
1e570 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
1e580 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
1e590 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
1e5a0 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
1e5b0 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
1e5c0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
1e5d0 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20  O_READLOCK)!=0; 
1e5e0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
1e5f0 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
1e600 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
1e610 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
1e620 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
1e630 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
1e640 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
1e650 20 75 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20   u16 szPageDflt 
1e660 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1e670 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
1e680 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
1e690 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  e */..  /* Figur
1e6a0 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
1e6b0 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
1e6c0 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
1e6d0 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
1e6e0 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
1e6f0 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
1e700 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
1e710 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
1e720 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74  . This.  ** is t
1e730 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
1e740 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
1e750 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
1e760 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a  al file handle .
1e770 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c    ** and a regul
1e780 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ar journal file-
1e790 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61  handle. Note tha
1e7a0 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75  t a "regular jou
1e7b0 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a  rnal-handle".  *
1e7c0 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70  * may be a wrapp
1e7d0 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61  er capable of ca
1e7e0 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ching the first 
1e7f0 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  portion of the j
1e800 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
1e810 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d   in memory to im
1e820 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d  plement the atom
1e830 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
1e840 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a  ation (see .  **
1e850 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75   source file jou
1e860 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20  rnal.c)..  */.  
1e870 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
1e880 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
1e890 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
1e8a0 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
1e8b0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
1e8c0 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
1e8d0 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
1e8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
1e8f0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
1e900 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d  OUND8(sqlite3Mem
1e910 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a  JournalSize());.
1e920 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
1e930 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
1e940 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
1e950 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
1e960 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
1e970 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
1e980 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
1e990 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
1e9a0 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
1e9b0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
1e9c0 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
1e9d0 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
1e9e0 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
1e9f0 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
1ea00 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
1ea10 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
1ea20 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
1ea30 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
1ea40 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
1ea50 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
1ea60 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  {.    nPathname 
1ea70 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
1ea80 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
1ea90 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
1eaa0 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
1eab0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
1eac0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1ead0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1eae0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
1eaf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
1eb00 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
1eb10 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
1eb20 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
1eb30 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
1eb40 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
1eb50 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
1eb60 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
1eb70 20 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61   {.      zPathna
1eb80 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
1eb90 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
1eba0 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
1ebb0 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
1ebc0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1ebd0 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
1ebe0 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
1ebf0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
1ec00 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
1ec10 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   }..    nPathnam
1ec20 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
1ec30 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
1ec40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ec50 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
1ec60 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
1ec70 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
1ec80 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
1ec90 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
1eca0 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
1ecb0 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
1ecc0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
1ecd0 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
1ece0 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
1ecf0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
1ed00 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
1ed10 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
1ed20 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1ed30 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1ed40 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
1ed50 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
1ed60 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
1ed70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1ed80 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
1ed90 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
1eda0 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
1edb0 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
1edc0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
1edd0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1ede0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
1edf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ee00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1ee10 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
1ee20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ee30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1ee40 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
1ee50 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
1ee60 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
1ee70 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
1ee80 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
1ee90 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
1eea0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
1eeb0 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
1eec0 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
1eed0 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
1eee0 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
1eef0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
1ef00 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
1ef10 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1ef20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
1ef30 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
1ef40 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
1ef50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1ef60 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
1ef70 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
1ef80 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
1ef90 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
1efa0 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
1efb0 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
1efc0 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
1efd0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1efe0 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
1eff0 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1f000 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
1f010 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1f020 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
1f030 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1f040 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
1f050 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
1f060 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
1f070 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
1f080 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
1f090 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
1f0a0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
1f0b0 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
1f0c0 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
1f0d0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
1f0e0 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
1f0f0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
1f100 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
1f110 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1f120 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
1f130 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
1f140 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
1f150 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
1f160 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
1f170 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
1f180 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
1f190 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1f1a0 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
1f1b0 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
1f1c0 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
1f1d0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
1f1e0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
1f1f0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
1f200 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
1f210 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 8 + 1         
1f220 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
1f230 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72   */.  );.  asser
1f240 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1f250 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
1f260 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
1f270 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
1f280 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
1f290 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f2a0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
1f2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1f2c0 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
1f2d0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
1f2e0 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
1f2f0 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
1f300 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
1f310 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f320 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
1f330 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
1f340 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
1f350 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
1f360 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
1f370 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
1f380 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
1f390 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f3a0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1f3b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
1f3c0 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
1f3d0 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
1f3e0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
1f3f0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f400 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
1f410 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
1f420 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
1f430 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
1f440 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
1f450 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
1f460 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
1f470 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
1f480 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
1f490 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
1f4a0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
1f4b0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61  hname ){.    pPa
1f4c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
1f4d0 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
1f4e0 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29  = nPathname + 1)
1f4f0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
1f500 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1f510 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
1f520 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
1f530 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
1f540 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
1f550 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
1f560 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
1f570 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
1f580 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  e], "-journal", 
1f590 38 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  8);.    if( pPag
1f5a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  er->zFilename[0]
1f5b0 3d 3d 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a  ==0 ) pPager->zJ
1f5c0 6f 75 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20  ournal[0] = 0;. 
1f5d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f5e0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
1f5f0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
1f600 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
1f610 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
1f620 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
1f630 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1f640 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
1f650 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
1f660 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20  me[0] && !memDb 
1f670 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
1f680 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1f690 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
1f6a0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
1f6b0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
1f6c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1f6d0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
1f6e0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
1f6f0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
1f700 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65  , &fout);.    re
1f710 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53  adOnly = (fout&S
1f720 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1f730 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  NLY);..    /* If
1f740 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
1f750 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
1f760 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
1f770 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
1f780 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
1f790 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
1f7a0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
1f7b0 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
1f7c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1f7d0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
1f7e0 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
1f7f0 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
1f800 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
1f810 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
1f820 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
1f830 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
1f840 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1f850 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
1f860 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
1f870 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
1f880 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
1f890 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
1f8a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
1f8b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1f8c0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1f8d0 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1f8e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
1f8f0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
1f900 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1f910 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f920 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
1f930 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
1f940 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
1f950 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
1f960 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
1f970 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f  ctorSize>SQLITE_
1f980 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f990 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
1f9a0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
1f9b0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f9c0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
1f9d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f9e0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1f9f0 74 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d  t = (u16)pPager-
1fa00 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
1fa10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
1fa20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1fa30 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1fa40 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
1fa50 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1fa60 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1fa70 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1fa80 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
1fa90 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61  nt ii;.        a
1faa0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
1fab0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
1fac0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
1fad0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
1fae0 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
1faf0 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
1fb00 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1fb10 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1fb20 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
1fb30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69  ;.        for(ii
1fb40 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
1fb50 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
1fb60 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
1fb70 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
1fb80 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
1fb90 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
1fba0 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20  (ii>>8)) ){.    
1fbb0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
1fbc0 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
1fbd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1fbe0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1fbf0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1fc00 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
1fc10 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
1fc20 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
1fc30 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
1fc40 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
1fc50 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
1fc60 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
1fc70 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
1fc80 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
1fc90 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
1fca0 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
1fcb0 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
1fcc0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
1fcd0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
1fce0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
1fcf0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
1fd00 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
1fd10 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
1fd20 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
1fd30 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
1fd40 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
1fd50 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
1fd60 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
1fd70 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
1fd80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
1fd90 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70      */ .    temp
1fda0 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
1fdb0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1fdc0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
1fdd0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
1fde0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
1fdf0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
1fe00 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1fe10 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
1fe20 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
1fe30 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
1fe40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
1fe50 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
1fe60 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
1fe70 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
1fe80 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
1fe90 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1fea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1feb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
1fec0 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
1fed0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1fee0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
1fef0 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
1ff00 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
1ff10 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1ff20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
1ff30 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
1ff40 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
1ff50 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
1ff60 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a  , free the .  **
1ff70 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1ff80 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
1ff90 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1ffa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ffb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1ffc0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
1ffd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
1ffe0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
1fff0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20000 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
20010 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
20020 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
20030 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
20040 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ct. */.  assert(
20050 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a   nExtra<1000 );.
20060 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
20070 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c  8(nExtra);.  sql
20080 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
20090 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
200a0 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
200c0 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
200d0 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
200e0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
200f0 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54  ache);..  PAGERT
20100 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
20110 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
20120 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
20130 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
20140 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
20150 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
20160 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
20170 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
20180 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
20190 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
201a0 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  al;.  pPager->no
201b0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65  Readlock = (noRe
201c0 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
201d0 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70  ly) ?1:0;.  /* p
201e0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
201f0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20200 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
20210 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20220 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
20230 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
20240 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d  eValid = (u8)mem
20250 44 62 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  Db;.  /* pPager-
20260 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
20270 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
20280 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
20290 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
202a0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
202b0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
202c0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
202d0 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
202e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
202f0 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
20300 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
20310 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
20320 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
20330 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
20340 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
20350 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
20360 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
20370 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
20380 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
20390 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
203a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
203b0 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
203c0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
203d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
203e0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
203f0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
20400 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
20410 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
20420 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
20430 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
20440 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20450 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20460 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
20470 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
20480 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
20490 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
204a0 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  u8)readOnly;.  /
204b0 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
204c0 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 61 73 73  nc = 0; */.  ass
204d0 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
204e0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
204f0 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
20500 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
20510 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
20520 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
20530 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
20540 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
20550 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
20560 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
20570 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
20580 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
20590 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
205a0 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
205b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
205c0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
205d0 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31  er->nExtra = (u1
205e0 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67  6)nExtra;.  pPag
205f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
20600 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  imit = SQLITE_DE
20610 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49  FAULT_JOURNAL_SI
20620 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65  ZE_LIMIT;.  asse
20630 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20640 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69  r->fd) || tempFi
20650 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  le );.  setSecto
20660 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
20670 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c   if( !useJournal
20680 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
20690 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
206a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
206b0 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OFF;.  }else if(
206c0 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
206d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
206e0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
206f0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
20700 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
20710 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
20720 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20730 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
20740 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
20750 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
20760 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d  Reinit;.  /* mem
20770 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
20780 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
20790 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
207a0 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  ..  *ppPager = p
207b0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
207c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
207d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
207e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
207f0 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
20800 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
20810 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
20820 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
20830 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
20840 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
20850 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
20860 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
20870 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
20880 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
20890 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
208a0 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
208b0 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
208c0 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
208d0 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
208e0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
208f0 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
20900 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
20910 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
20920 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
20930 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
20940 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
20950 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
20960 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
20970 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
20980 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20990 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
209a0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
209b0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
209c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
209d0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
209e0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
209f0 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
20a00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
20a10 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
20a20 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
20a30 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
20a40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20a50 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
20a60 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
20a70 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
20a80 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
20a90 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
20aa0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
20ab0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
20ac0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
20ad0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
20ae0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
20af0 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
20b00 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
20b10 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
20b20 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
20b30 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
20b40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20b50 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
20b60 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
20b70 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20b80 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
20b90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
20ba0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
20bb0 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
20bc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
20bd0 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
20be0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
20bf0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
20c00 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
20c10 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
20c20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
20c30 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
20c40 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
20c50 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
20c60 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
20c70 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
20c80 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
20c90 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
20ca0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
20cb0 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
20cc0 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
20cd0 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
20ce0 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
20cf0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
20d00 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
20d10 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
20d20 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
20d30 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
20d40 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
20d50 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
20d60 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
20d70 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
20d80 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
20d90 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
20da0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20db0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20dc0 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
20dd0 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
20de0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
20df0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
20e00 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
20e10 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20e20 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
20e30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20e40 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
20e50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
20e60 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
20e70 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
20e80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20ea0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
20eb0 74 20 65 78 69 73 74 73 3b 20 20 20 20 20 20 20  t exists;       
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20ed0 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
20ee0 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20ef0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
20f00 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
20f10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
20f20 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
20f30 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
20f40 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
20f50 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
20f60 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
20f70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20f80 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53  state <= PAGER_S
20f90 48 41 52 45 44 20 29 3b 0a 0a 20 20 2a 70 45 78  HARED );..  *pEx
20fa0 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
20fb0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20fc0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
20fd0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
20fe0 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
20ff0 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
21000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21010 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
21020 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
21030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21040 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
21050 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
21060 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
21070 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
21080 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
21090 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
210a0 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
210b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
210c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
210d0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
210e0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
210f0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
21100 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
21110 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
21120 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
21130 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
21140 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
21150 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
21160 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
21170 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
21180 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
21190 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
211a0 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
211b0 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
211c0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
211d0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
211e0 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
211f0 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
21200 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
21210 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
21220 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
21230 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
21240 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
21250 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
21260 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
21270 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
21280 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
21290 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
212a0 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
212b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
212c0 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
212d0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
212e0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
212f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
21300 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
21310 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
21320 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
21330 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
21340 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
21350 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
21360 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
21370 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
21380 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
21390 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
213a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
213b0 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
213c0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
213d0 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
213e0 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
213f0 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
21400 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
21410 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
21420 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
21430 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
21440 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
21450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21460 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
21470 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
21480 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
21490 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
214a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
214b0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
214c0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
214d0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
214e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
214f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
21500 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
21510 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
21520 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21530 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
21540 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
21550 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
21560 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
21570 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
21580 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
21590 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
215a0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
215b0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
215c0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
215d0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
215e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
215f0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
21600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21610 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
21620 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
21630 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
21640 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
21650 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
21660 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
21670 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
21680 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
21690 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
216a0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
216b0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
216c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
216d0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
216e0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
216f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
21700 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21710 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
21720 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
21730 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21740 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
21750 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
21760 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
21770 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20  , f, &f);.      
21780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
217a0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
217b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
217c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
217d0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
217e0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
217f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21810 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
21820 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
21830 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21840 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
21850 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21860 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
21870 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
21880 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
21890 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
218a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
218b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
218c0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
218d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
218e0 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
218f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
21900 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
21910 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
21920 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a    ** its has a z
21930 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
21940 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
21950 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
21960 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
21970 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
21980 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
21990 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
219a0 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
219b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
219c0 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
219d0 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
219e0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
219f0 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
21a00 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
21a10 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
21a20 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
21a30 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
21a40 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
21a50 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
21a60 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
21a70 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
21a80 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
21a90 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
21aa0 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
21ab0 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
21ac0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
21ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21ae0 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
21af0 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
21b00 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
21b10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
21b20 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
21b30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21b40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
21b50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
21b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21b70 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
21b80 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
21b90 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
21ba0 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
21bb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
21bc0 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
21bd0 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
21be0 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
21bf0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
21c00 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
21c10 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
21c20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21c30 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
21c40 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
21c50 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
21c60 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
21c70 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
21c80 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
21c90 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21ca0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
21cb0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
21cc0 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
21cd0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
21ce0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
21cf0 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
21d00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21d10 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
21d20 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
21d30 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
21d40 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
21d50 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
21d60 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
21d70 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
21d80 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70   pPg */.  Pgno p
21d90 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
21da0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
21db0 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f  umber to read */
21dc0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21de0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21df0 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  /.  i64 iOffset;
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
21e20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61 64 20  of file to read 
21e30 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  from */..  asser
21e40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21e50 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 26  >=PAGER_SHARED &
21e60 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  & !MEMDB );.  as
21e70 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
21e80 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69  ger->fd) );..  i
21e90 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65 6e  f( NEVER(!isOpen
21ea0 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b  (pPager->fd)) ){
21eb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21ec0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
21ed0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d  .    memset(pPg-
21ee0 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
21ef0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
21f00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f10 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65  OK;.  }.  iOffse
21f20 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
21f30 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
21f40 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
21f50 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
21f60 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
21f70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21f80 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  e, iOffset);.  i
21f90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
21fa0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
21fb0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
21fc0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
21fd0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
21fe0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
21ff0 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
22000 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
22010 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
22020 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
22030 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
22040 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
22050 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
22060 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
22070 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
22080 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
22090 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
220a0 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
220b0 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
220c0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
220d0 6f 2e 20 20 42 79 74 65 73 20 33 32 2e 2e 33 35  o.  Bytes 32..35
220e0 20 61 6e 64 20 33 35 2e 2e 33 39 20 73 68 6f 75   and 35..39 shou
220f0 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
22100 72 73 20 77 68 69 63 68 20 61 72 65 0a 20 20 20  rs which are.   
22110 20 20 20 2a 2a 20 6e 65 76 65 72 20 30 78 66 66     ** never 0xff
22120 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
22130 69 6e 67 20 70 50 61 67 65 72 2d 3e 64 62 46 69  ing pPager->dbFi
22140 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
22150 6c 20 30 78 66 66 0a 20 20 20 20 20 20 2a 2a 20  l 0xff.      ** 
22160 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
22170 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
22180 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
22190 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
221a0 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
221b0 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
221c0 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
221d0 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
221e0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
221f0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
22200 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
22210 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
22220 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c 69 6e   noising equalin
22230 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30 78  g 16 bytes of 0x
22240 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c  ff is vanishingl
22250 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20  y small so.     
22260 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74   ** we should st
22270 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20  ill be ok..     
22280 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   */.      memset
22290 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
222a0 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f  ers, 0xff, sizeo
222b0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
222c0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Vers));.    }els
222d0 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46  e{.      u8 *dbF
222e0 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a  ileVers = &((u8*
222f0 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
22300 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
22310 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
22320 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
22330 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
22340 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
22350 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28   }.  }.  CODEC1(
22360 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
22370 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
22380 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
22390 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
223a0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
223b0 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
223c0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
223d0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
223e0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
223f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
22400 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
22410 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
22420 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
22430 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22440 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
22450 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
22460 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
22470 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22480 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22490 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
224a0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
224b0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
224c0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
224d0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
224e0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
224f0 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
22500 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
22510 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
22520 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
22530 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
22540 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
22550 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
22560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
22570 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
22580 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
22590 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
225a0 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
225b0 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
225c0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
225d0 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
225e0 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
225f0 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
22600 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
22610 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
22620 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22630 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
22640 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
22650 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
22660 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
22670 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22680 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
22690 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
226a0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
226b0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
226c0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
226d0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
226e0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
226f0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
22700 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
22710 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
22720 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
22730 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
22740 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
22750 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
22760 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
22770 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
22780 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
22790 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
227a0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
227b0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
227c0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
227d0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
227e0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
227f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
22800 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
22810 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
22820 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
22830 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
22840 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
22850 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
22860 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
22870 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
22880 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
22890 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
228a0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
228b0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
228c0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
228d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
228e0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
228f0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
22900 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
22910 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
22920 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
22930 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
22940 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  (2) above is not
22950 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20   attempted, and 
22960 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20  if the.** pager 
22970 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
22980 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
22990 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e  SQLITE_FULL when
229a0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
229b0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74  .** the error st
229c0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
229d0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69  s returned. It i
229e0 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72  s permitted to r
229f0 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ead the.** datab
22a00 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49  ase when in SQLI
22a10 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74  TE_FULL error st
22a20 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ate..**.** Other
22a30 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
22a40 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
22a50 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
22a60 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a  returned. If an.
22a70 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  ** IO error occu
22a80 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
22a90 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
22aa0 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
22ab0 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
22ac0 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  e or rolling bac
22ad0 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
22ae0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
22af0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
22b00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22b10 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
22b20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22b30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22b40 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
22b50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22b60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72  de */.  int isEr
22b70 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20  rorReset = 0;   
22b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
22b90 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67  ue if recovering
22ba0 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74   from error stat
22bb0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
22bc0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
22bd0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
22be0 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
22bf0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
22c00 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
22c10 61 67 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ages */.  assert
22c20 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
22c30 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
22c40 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
22c50 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42   if( NEVER(MEMDB
22c60 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
22c70 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70  ode) ){ return p
22c80 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20  Pager->errCode; 
22c90 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
22ca0 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 61  database is in a
22cb0 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e  n error-state, n
22cc0 6f 77 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  ow is a chance t
22cd0 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
22ce0 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
22cf0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22d00 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
22d10 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  and rollback.  *
22d20 2a 20 61 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61  * any hot journa
22d30 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
22d40 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  stem..  */.  if(
22d50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22d60 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   ){.    if( isOp
22d70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
22d80 7c 7c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  || pPager->zJour
22d90 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 73 45  nal ){.      isE
22da0 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
22db0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
22dc0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
22dd0 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
22de0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
22df0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
22e00 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
22e10 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72  NLOCK || isError
22e20 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  Reset ){.    sql
22e30 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
22e40 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
22e50 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73  pVfs;.    int is
22e60 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  HotJournal = 0;.
22e70 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
22e80 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
22e90 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
22ea0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
22eb0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
22ec0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
22ed0 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
22ee0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22ef0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  r->readOnly );. 
22f00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
22f10 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
22f20 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
22f30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
22f40 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
22f50 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
22f60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
22f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22f80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
22f90 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
22fa0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
22fb0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
22fc0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
22fd0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
22fe0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
22ff0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
23000 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20  RED_LOCK );..   
23010 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
23020 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
23030 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
23040 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
23050 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
23060 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
23070 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
23080 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
23090 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
230a0 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45 72  */.    if( !isEr
230b0 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
230c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
230d0 2d 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52  ->state <= PAGER
230e0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 20  _SHARED );.     
230f0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
23100 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48  nal(pPager, &isH
23110 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
23120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
23140 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
23150 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
23160 28 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c  ( isErrorReset |
23170 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  | isHotJournal )
23180 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  {.      /* Get a
23190 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
231a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
231b0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
231c0 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
231d0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
231e0 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
231f0 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
23200 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
23210 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
23220 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
23230 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
23240 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
23250 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
23260 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
23270 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
23280 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
23290 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
232a0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
232b0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
232c0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
232d0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
232e0 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
232f0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
23300 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
23310 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
23320 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
23330 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
23340 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
23350 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
23360 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
23370 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
23380 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
23390 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
233a0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
233b0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
233c0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
233d0 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
233e0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
233f0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
23400 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
23410 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
23420 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
23430 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
23440 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23450 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
23460 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
23470 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
23480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
234a0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
234b0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
234c0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
234d0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
234e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
234f0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
23500 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  SIVE;.      }. .
23510 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
23520 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
23530 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
23540 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
23550 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78   in .      ** ex
23560 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
23570 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
23580 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
23590 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
235a0 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20      ** possibly 
235b0 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
235c0 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
235d0 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
235e0 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  , the.      ** O
235f0 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
23600 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
23610 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
23620 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
23630 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69     ** a read/wri
23640 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  te file handle..
23650 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
23660 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
23670 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
23680 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
23690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
236a0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50  OsAccess(pVfs,pP
236b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53  ager->zJournal,S
236c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
236d0 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20  STS,&res);.     
236e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
236f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23700 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
23710 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
23720 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
23730 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
23740 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23750 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
23760 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
23770 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
23780 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
23790 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
237a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
237b0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
237c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
237d0 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
237e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
237f0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
23800 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
23810 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
23820 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
23830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23840 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
23850 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
23860 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
23870 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
23880 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
23890 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
238a0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
238b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
238c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
238d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
238e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
238f0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
23900 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
23910 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
23920 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
23930 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
23940 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
23950 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
23960 6f 72 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ore .           
23970 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
23980 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
23990 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
239a0 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
239b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61             ** ma
239c0 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
239d0 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
239e0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
239f0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
23a00 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
23a10 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
23a20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
23a30 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  oes not exist.  
23a40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
23a50 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
23a60 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
23a70 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23a80 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23a90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
23aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23ab0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23ac0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
23ad0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20     /* TODO: Why 
23ae0 61 72 65 20 74 68 65 73 65 20 63 6c 65 61 72 65  are these cleare
23af0 64 20 68 65 72 65 3f 20 49 73 20 69 74 20 6e 65  d here? Is it ne
23b00 63 65 73 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20  cessary? */.    
23b10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
23b20 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
23b30 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23b40 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
23b50 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
23b60 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
23b70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
23b80 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f  r = 0;. .      /
23b90 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
23ba0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
23bb0 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
23bc0 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
23bd0 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
23be0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
23bf0 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
23c00 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
23c10 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
23c20 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
23c30 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
23c40 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
23c50 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
23c60 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
23c70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23c80 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
23c90 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
23ca0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
23cb0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
23cc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23cd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23ce0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
23cf0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
23d00 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
23d10 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23d30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23d40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
23d50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
23d60 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
23d70 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
23d80 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
23d90 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
23da0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
23db0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23dc0 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
23dd0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
23de0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
23df0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
23e00 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
23e10 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
23e20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
23e30 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
23e40 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
23e50 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
23e60 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
23e70 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
23e80 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
23e90 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
23ea0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
23eb0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
23ec0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
23ed0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
23ee0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
23ef0 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
23f00 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
23f10 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
23f20 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
23f30 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
23f40 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
23f50 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
23f60 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
23f70 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
23f80 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
23f90 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
23fa0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
23fb0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
23fc0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
23fd0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
23fe0 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
23ff0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
24000 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
24010 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
24020 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
24030 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
24040 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
24050 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
24060 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
24070 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
24080 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
24090 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
240a0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
240b0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
240c0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
240d0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
240e0 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
240f0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
24100 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
24110 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  /.      int nPag
24120 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  e;.      char db
24130 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
24140 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
24150 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  rs)];.      sqli
24160 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
24170 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
24180 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
24190 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
241a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
241b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
241c0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
241d0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
241e0 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
241f0 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
24200 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
24210 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
24220 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
24230 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
24240 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
24250 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
24260 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
24270 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
24280 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
24290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
242a0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
242b0 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
242c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
242d0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
242e0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
242f0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
24300 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
24310 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
24320 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
24330 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
24340 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
24350 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
24360 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
24370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
24380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24390 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
243a0 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  | pPager->state=
243b0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
243c0 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
243d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
243e0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
243f0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
24400 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
24410 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
24420 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
24430 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
24440 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
24450 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
24470 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
24480 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
24490 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
244a0 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
244b0 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
244c0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
244d0 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
244e0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
244f0 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
24500 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
24510 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
24520 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
24530 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
24540 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
24550 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
24560 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
24570 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
24580 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
24590 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
245a0 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
245b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
245c0 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
245d0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
245e0 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26  PCache)==0).   &
245f0 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
24600 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
24610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
24620 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67  0) .  ){.    pag
24630 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
24640 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
24650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
24660 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
24670 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
24680 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
24690 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
246a0 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
246b0 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
246c0 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
246d0 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
246e0 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
246f0 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
24700 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
24710 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
24720 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
24730 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
24740 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
24750 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
24760 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
24770 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
24780 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
24790 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
247a0 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
247b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
247c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
247d0 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
247e0 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
247f0 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
24800 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
24810 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
24820 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
24830 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
24840 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
24850 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
24860 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
24870 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
24880 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
24890 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
248a0 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
248b0 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
248c0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
248d0 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
248e0 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
248f0 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
24900 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
24910 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24920 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
24930 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
24940 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
24950 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
24960 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
24970 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
24980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
24990 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
249a0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
249b0 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
249c0 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
249d0 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
249e0 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
249f0 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
24a00 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
24a10 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
24a20 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
24a30 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
24a40 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
24a50 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
24a60 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
24a70 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
24a80 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
24a90 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
24aa0 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
24ab0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
24ac0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
24ad0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
24ae0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
24af0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
24b00 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
24b10 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
24b20 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
24b30 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
24b40 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
24b50 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
24b60 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
24b70 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
24b80 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
24b90 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
24ba0 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
24bb0 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
24bc0 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
24bd0 63 61 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74  cache to populat
24be0 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  e with the data 
24bf0 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
24c00 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
24c10 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
24c20 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
24c30 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
24c40 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
24c50 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
24c60 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
24c70 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
24c80 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
24c90 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
24ca0 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
24cb0 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
24cc0 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
24cd0 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
24ce0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
24cf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
24d00 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
24d10 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
24d20 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
24d30 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
24d40 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
24d50 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
24d60 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
24d70 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
24d80 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
24d90 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
24da0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
24db0 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
24dc0 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
24dd0 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
24de0 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
24df0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
24e00 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
24e10 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
24e20 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
24e30 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
24e40 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
24e50 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
24e60 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
24e70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
24e80 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
24e90 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
24ea0 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
24eb0 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
24ec0 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
24ed0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
24ee0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
24ef0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
24f00 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
24f10 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
24f20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
24f30 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
24f40 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
24f50 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
24f60 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
24f70 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
24f80 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
24f90 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
24fa0 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
24fb0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
24fc0 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
24fd0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
24fe0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
24ff0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
25000 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
25010 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
25020 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
25030 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
25040 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
25050 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
25060 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
25070 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
25080 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
25090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
250a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
250b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
250c0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
250d0 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
250e0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
250f0 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
25100 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
25110 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
25120 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
25130 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
25140 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
25150 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
25160 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
25170 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
25180 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
25190 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
251a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
251b0 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
251c0 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28  UNLOCK );..  if(
251d0 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
251e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
251f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25200 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
25210 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
25220 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
25230 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
25240 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
25250 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
25260 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
25270 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
25280 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
25290 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
252a0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65  _OK && pPager->e
252b0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
252c0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
252d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
252e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
252f0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
25300 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
25310 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20  Cache, pgno, 1, 
25320 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  ppPage);.  }..  
25330 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25340 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
25350 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
25360 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
25370 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
25380 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
25390 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
253a0 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
253b0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
253c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
253d0 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
253e0 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
253f0 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
25400 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
25410 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
25420 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
25430 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
25440 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
25450 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
25460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
25470 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
25480 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50 61  pPager || (*ppPa
25490 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  ge)->pPager==0 )
254a0 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  ;..  if( (*ppPag
254b0 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e  e)->pPager && !n
254c0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
254d0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
254e0 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61  the pcache alrea
254f0 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69  dy contains an i
25500 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20  nitialized copy 
25510 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  of.    ** the pa
25520 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  ge. Return witho
25530 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20  ut further ado. 
25540 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
25550 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f  pgno<=PAGER_MAX_
25560 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41  PGNO && pgno!=PA
25570 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
25580 65 72 29 20 29 3b 0a 20 20 20 20 50 41 47 45 52  er) );.    PAGER
25590 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
255a0 69 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  it);.    return 
255b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
255c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
255d0 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
255e0 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
255f0 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
25600 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
25610 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
25620 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61    */.    int nMa
25630 78 3b 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  x;..    PAGER_IN
25640 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
25650 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  );.    pPg = *pp
25660 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
25670 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
25680 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
25690 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
256a0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
256b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
256c0 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
256d0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
256e0 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
256f0 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
25700 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
25710 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
25720 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
25730 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
25740 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
25750 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
25760 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25770 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
25780 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25790 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
257a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
257b0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
257c0 20 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28   &nMax);.    if(
257d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
257e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
257f0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
25800 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
25810 45 4d 44 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e  EMDB || nMax<(in
25820 74 29 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  t)pgno || noCont
25830 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ent || !isOpen(p
25840 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
25850 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
25860 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 09  ger->mxPgno ){..
25870 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
25880 3b 0a 09 67 6f 74 6f 20 70 61 67 65 72 5f 61 63  ;..goto pager_ac
25890 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
258a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
258b0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
258c0 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
258d0 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
258e0 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
258f0 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
25900 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
25910 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
25920 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
25930 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
25940 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
25950 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
25960 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
25970 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
25980 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
25990 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
259a0 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
259b0 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
259c0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
259d0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
259e0 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
259f0 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
25a00 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
25a10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
25a20 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
25a30 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
25a40 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
25a50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
25a60 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
25a70 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
25a80 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
25a90 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
25aa0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
25ab0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
25ac0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
25ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25ae0 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
25af0 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
25b00 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
25b10 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
25b20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
25b30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
25b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
25b50 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
25b60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
25b70 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
25b80 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
25b90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
25ba0 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
25bb0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
25bc0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
25bd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25be0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
25bf0 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
25c00 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
25c10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
25c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25c30 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
25c40 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
25c50 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65     }.    }.#ifde
25c60 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
25c70 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
25c80 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
25c90 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
25ca0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
25cb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
25cc0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25cd0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
25ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
25cf0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
25d00 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
25d10 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
25d20 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
25d30 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
25d40 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
25d50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
25d60 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
25d70 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
25d80 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
25d90 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
25da0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
25db0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
25dc0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25dd0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
25de0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
25df0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41   not in cache. A
25e00 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66  lso, return 0 if
25e10 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69   the .** pager i
25e20 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43  s in PAGER_UNLOC
25e30 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  K state when thi
25e40 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25e50 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74  lled,.** or if t
25e60 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  he pager is in a
25e70 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
25e80 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
25e90 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  FULL..**.** See 
25ea0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
25eb0 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
25ec0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
25ed0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
25ee0 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
25ef0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
25f00 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
25f10 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
25f20 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
25f30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
25f40 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
25f50 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
25f60 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
25f70 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
25f80 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
25f90 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
25fa0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
25fb0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
25fc0 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
25fd0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
25fe0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
25ff0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
26000 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  pPg = 0;.  asser
26010 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
26020 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
26030 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26040 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d  Pager->pPCache!=
26050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26060 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3e 20 50  Pager->state > P
26070 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
26080 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
26090 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
260a0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
260b0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
260c0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
260d0 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
260e0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
260f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
26100 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
26110 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
26120 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
26130 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
26140 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
26150 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
26160 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
26170 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
26180 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
26190 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
261a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
261b0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
261c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
261d0 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
261e0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
261f0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
26200 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
26210 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  er;.    sqlite3P
26220 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
26230 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  );.    pagerUnlo
26240 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
26250 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
26260 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   If the main jou
26270 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c  rnal file has al
26280 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
26290 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  d, ensure that t
262a0 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  he.** sub-journa
262b0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74  l file is open t
262c0 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20  oo. If the main 
262d0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f  journal is not o
262e0 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  pen,.** this fun
262f0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26300 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
26310 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
26320 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
26330 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
26340 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54  an. .** An SQLIT
26350 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
26360 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
26370 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
26380 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  .** sqlite3OsOpe
26390 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  n() fails..*/.st
263a0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
263b0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
263c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
263d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
263e0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
263f0 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
26400 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
26410 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
26420 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
26430 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
26440 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
26450 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
26460 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
26470 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
26480 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
26490 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
264a0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
264b0 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
264c0 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45  er->sjfd, SQLITE
264d0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
264e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
264f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26500 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26510 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
26520 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
26530 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
26540 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
26550 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
26560 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
26570 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
26580 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
26590 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
265a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
265b0 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
265c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
265d0 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
265e0 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
265f0 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
26600 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
26610 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
26620 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
26630 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
26640 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
26650 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26660 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
26670 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26680 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
26690 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
266a0 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
266b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
266c0 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
266d0 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
266e0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
266f0 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
26700 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
26710 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26720 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
26730 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
26740 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
26750 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
26760 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
26770 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
26780 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
26790 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
267a0 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
267b0 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
267c0 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
267d0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
267e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
267f0 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
26800 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
26810 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
26820 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
26830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
26840 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
26850 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
26860 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
26870 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
26880 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
26890 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
268a0 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
268b0 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
268c0 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
268d0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
268e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
268f0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
26900 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
26910 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
26920 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26930 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
26940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26950 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
26960 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ode */.  int nPa
26970 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26990 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
269a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
269b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
269c0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
269d0 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
269e0 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
269f0 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
26a00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26a10 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
26a20 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
26a30 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
26a40 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
26a50 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
26a60 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
26a70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
26a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26a90 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
26aa0 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
26ab0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
26ac0 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
26ad0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
26ae0 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
26af0 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
26b00 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
26b10 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
26b20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
26b30 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
26b40 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
26b50 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
26b60 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
26b70 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
26b80 64 65 3b 0a 0a 20 20 74 65 73 74 63 61 73 65 28  de;..  testcase(
26b90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
26ba0 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 72 63 20  alid==0 );.  rc 
26bb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
26bc0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
26bd0 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
26be0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26bf0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
26c00 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
26c10 76 65 63 43 72 65 61 74 65 28 6e 50 61 67 65 29  vecCreate(nPage)
26c20 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
26c30 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
26c40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26c50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
26c60 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
26c70 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
26c80 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
26c90 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69  pen. */.  if( !i
26ca0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
26cb0 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
26cc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
26cd0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
26ce0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
26cf0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
26d00 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
26d10 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  r->jfd);.    }el
26d20 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
26d30 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20  int flags =     
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d50 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70   VFS flags to op
26d60 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
26d70 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
26d80 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
26d90 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
26da0 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50  ATE|.        (pP
26db0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
26dc0 20 0a 20 20 20 20 20 20 20 20 20 20 28 53 51 4c   .          (SQL
26dd0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
26de0 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
26df0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
26e00 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53 51 4c  :.          (SQL
26e10 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
26e20 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29  URNAL).        )
26e30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
26e40 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
26e50 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ITE.      rc = s
26e60 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
26e70 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56 66  n(.          pVf
26e80 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
26e90 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
26ea0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
26eb0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
26ec0 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20        );.#else. 
26ed0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26ee0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
26ef0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
26f00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
26f10 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  gs, 0);.#endif. 
26f20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
26f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
26f40 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
26f50 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20  >jfd) );.  }... 
26f60 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
26f70 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
26f80 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  er to the journa
26f90 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20  l file and open 
26fa0 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f  .  ** the sub-jo
26fb0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
26fc0 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ry..  */.  if( r
26fd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26fe0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
26ff0 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
27000 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
27010 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70  quired. */.    p
27020 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
27030 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
27040 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ze;.    pPager->
27050 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
27060 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
27070 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
27080 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
27090 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
270a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
270b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
270c0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
270d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
270e0 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
270f0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
27100 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
27110 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27120 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76   && pPager->nSav
27130 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72 63  epoint ){.    rc
27140 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
27150 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
27160 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27170 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
27180 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
27190 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
271a0 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
271b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
271c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
271d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
271e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
271f0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
27200 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
27210 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
27220 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
27230 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
27240 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
27250 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
27260 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
27270 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
27280 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
27290 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
272a0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
272b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
272c0 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
272d0 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
272e0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
272f0 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
27300 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
27310 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
27320 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
27330 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
27340 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
27350 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
27360 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79   not a temporary
27370 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   or in-memory fi
27380 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72  le and, the jour
27390 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20  nal file is .** 
273a0 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61 73  opened if it has
273b0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61 64   not been alread
273c0 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72 61  y. For a tempora
273d0 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70 65  ry file, the ope
273e0 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ning .** of the 
273f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27400 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74  deferred until t
27410 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75 61  here is an actua
27420 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72  l need to .** wr
27430 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
27440 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68 61  al. TODO: Why ha
27450 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  ndle temporary f
27460 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79  iles differently
27470 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ?.**.** If the j
27480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
27490 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74 20  pened (or if it 
274a0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  is already open)
274b0 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72  , then a.** jour
274c0 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72  nal-header is wr
274d0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61  itten to the sta
274e0 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rt of it..**.** 
274f0 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
27500 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
27510 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
27520 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  ny sub-journal o
27530 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  pened.** within 
27540 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
27550 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
27560 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
27570 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61  file. This.** ha
27580 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74  s no effect if t
27590 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
275a0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
275b0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77   (as it may be w
275c0 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  hen.** running i
275d0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
275e0 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e  ) or if the tran
275f0 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  saction does not
27600 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75   require a.** su
27610 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  b-journal. If th
27620 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
27630 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c  rgument is zero,
27640 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
27650 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  ed.** sub-journa
27660 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l is implemented
27670 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50   in-memory if pP
27680 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65  ager is an in-me
27690 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a  mory database, .
276a0 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65  ** or using a te
276b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68  mporary file oth
276c0 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
276d0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
276e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
276f0 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20  int exFlag, int 
27700 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20  subjInMemory){. 
27710 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
27720 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
27730 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
27740 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
27750 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
27760 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49  mory = (u8)subjI
27770 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28 20 70  nMemory;.  if( p
27780 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
27790 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
277a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
277b0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
277c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
277d0 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67 65 72  MEMDB && !pPager
277e0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
277f0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
27800 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
27810 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27820 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
27830 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 2a   parameter.    *
27840 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
27850 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
27860 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
27870 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
27880 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79 2d 68  he.    ** busy-h
27890 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
278a0 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e  can be used when
278b0 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68   upgrading to th
278c0 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20  e EXCLUSIVE.    
278d0 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
278e0 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
278f0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
27900 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
27910 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
27920 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
27930 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
27940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
27960 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
27970 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
27980 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
27990 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
279a0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
279b0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
279c0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
279d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e  .    }..    /* N
279e0 6f 20 6e 65 65 64 20 74 6f 20 6f 70 65 6e 20 74  o need to open t
279f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27a00 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 49  at this time.  I
27a10 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  t will be.    **
27a20 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 69   opened before i
27a30 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 2e  t is written to.
27a40 20 20 49 66 20 77 65 20 64 65 66 65 72 20 6f 70    If we defer op
27a50 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
27a60 6c 2c 0a 20 20 20 20 2a 2a 20 77 65 20 6d 69 67  l,.    ** we mig
27a70 68 74 20 73 61 76 65 20 74 68 65 20 77 6f 72 6b  ht save the work
27a80 20 6f 66 20 63 72 65 61 74 69 6e 67 20 61 20 66   of creating a f
27a90 69 6c 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  ile if the trans
27aa0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e  action.    ** en
27ab0 64 73 20 75 70 20 62 65 69 6e 67 20 61 20 6e 6f  ds up being a no
27ac0 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 7d 65  -op..    */.  }e
27ad0 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70  lse if( isOpen(p
27ae0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
27af0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
27b00 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
27b10 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
27b20 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
27b30 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
27b40 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74  ss mode the last
27b50 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
27b60 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
27b70 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
27b80 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
27b90 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
27ba0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
27bb0 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
27bc0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
27bd0 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
27be0 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
27bf0 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72  nd either was tr
27c00 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
27c10 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72  es or its header
27c20 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72   was.    ** over
27c30 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72  written with zer
27c40 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  os..    */.    a
27c50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
27c60 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
27c70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
27c80 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  OrigSize==0 );. 
27c90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27ca0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
27cb0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
27cc0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
27cd0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
27ce0 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
27cf0 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
27d00 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
27d10 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
27d30 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64  sert( !pPager->d
27d40 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20  bModified );.   
27d50 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49   /* Ignore any I
27d60 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  O error that occ
27d70 75 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72  urs within pager
27d80 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
27d90 28 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  (). The.    ** p
27da0 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
27db0 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20  all is to reset 
27dc0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
27dd0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a  te of the pager.
27de0 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65      ** sub-syste
27df0 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61  m. It doesn't ma
27e00 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72  tter if the jour
27e10 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
27e20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20  properly.    ** 
27e30 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69  finalized at thi
27e40 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69  s point (since i
27e50 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
27e60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
27e70 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  yway)..    */.  
27e80 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
27e90 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
27ea0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
27eb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
27ec0 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
27ed0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
27ee0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
27ef0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
27f00 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
27f10 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
27f20 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
27f30 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
27f40 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
27f50 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
27f60 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
27f70 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
27f80 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
27f90 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
27fa0 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
27fb0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
27fc0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
27fd0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
27fe0 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
27ff0 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
28000 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
28010 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
28020 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
28030 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
28040 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
28050 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
28060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28070 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
28080 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
28090 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
280a0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
280b0 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72  y been.  ** star
280c0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
280d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
280e0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
280f0 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  D );..  /* If an
28100 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
28110 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63  previously detec
28120 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20  ted, report the 
28130 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20  same error.  ** 
28140 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
28150 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
28160 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75  errCode) )  retu
28170 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
28180 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72  de;..  /* Higher
28190 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20  -level routines 
281a0 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20  never call this 
281b0 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61  function if data
281c0 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  base is not.  **
281d0 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20   writable.  But 
281e0 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75  check anyway, ju
281f0 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  st for robustnes
28200 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
28210 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  R(pPager->readOn
28220 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ly) ) return SQL
28230 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73  ITE_PERM;..  ass
28240 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
28250 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
28260 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
28270 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
28280 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
28290 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
282a0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
282b0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
282c0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
282d0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
282e0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
282f0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
28300 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
28310 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
28320 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69  g) && !subjRequi
28330 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
28340 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
28350 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65  dified = 1;.  }e
28360 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
28370 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
28380 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
28390 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
283a0 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
283b0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
283c0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
283d0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
283e0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
283f0 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
28400 20 20 20 2a 2a 20 48 69 67 68 65 72 20 6c 65 76     ** Higher lev
28410 65 6c 20 72 6f 75 74 69 6e 65 73 20 73 68 6f 75  el routines shou
28420 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
28430 73 74 61 72 74 65 64 20 61 20 74 72 61 6e 73 61  started a transa
28440 63 74 69 6f 6e 2c 0a 20 20 20 20 2a 2a 20 77 68  ction,.    ** wh
28450 69 63 68 20 6d 65 61 6e 73 20 74 68 65 79 20 68  ich means they h
28460 61 76 65 20 61 63 71 75 69 72 65 64 20 74 68 65  ave acquired the
28470 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73   necessary locks
28480 20 62 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63   but the rollbac
28490 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  k.    ** journal
284a0 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
284b0 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  e open..    */. 
284c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
284d0 61 67 65 72 42 65 67 69 6e 28 70 50 61 67 65 72  agerBegin(pPager
284e0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75 62  , 0, pPager->sub
284f0 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20  jInMemory);.    
28500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28510 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
28520 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
28530 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
28540 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
28550 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
28560 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
28570 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
28580 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28590 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
285a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
285b0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
285c0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
285d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
285e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
285f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
28600 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20  dified = 1;.  . 
28610 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
28620 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
28630 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
28640 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
28650 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
28660 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
28670 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
28680 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
28690 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
286a0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
286b0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
286c0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
286d0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
286e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67   */.    if( !pag
286f0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
28700 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
28710 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
28720 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
28730 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
28740 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  e ){.        u32
28750 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
28760 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
28770 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
28780 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
28790 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
287a0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
287b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
287c0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
287d0 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
287e0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
287f0 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
28800 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
28810 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
28820 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
28830 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
28840 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
28850 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
28860 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
28870 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
28880 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
28890 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  a2);.        cks
288a0 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
288b0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
288c0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72  ata2);.        r
288d0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
288e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
288f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
28900 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
28910 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28930 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28940 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28950 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
28960 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
28990 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
289a0 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
289b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
289c0 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
289d0 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
289e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
289f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28a00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28a10 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
28a20 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
28a30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73  >journalOff, cks
28a40 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  um);.          p
28a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28a60 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
28a70 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
28a80 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
28a90 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
28aa0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28ad0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
28ae0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
28af0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
28b00 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
28b10 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
28b20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
28b30 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
28b40 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
28b50 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
28b60 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
28b70 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
28b80 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
28b90 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
28ba0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
28bb0 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
28bc0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
28bd0 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
28be0 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
28bf0 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  ll error occurre
28c00 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  d while journall
28c10 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
28c20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
28c30 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
28c40 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
28c50 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
28c60 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
28c70 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
28c80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
28c90 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
28ca0 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
28cb0 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
28cc0 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
28cd0 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
28ce0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
28cf0 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
28d00 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
28d10 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
28d20 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
28d30 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
28d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
28d50 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
28d60 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
28d70 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
28d80 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
28d90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
28da0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
28db0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
28dc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
28dd0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
28de0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
28df0 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
28e00 63 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74  curred writing t
28e10 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28e20 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  le. The .       
28e30 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
28e40 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
28e50 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
28e60 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
28e70 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
28e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28e90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
28ea0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
28eb0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28ec0 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
28ed0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28ee0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
28ef0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28f00 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
28f10 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
28f20 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
28f30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
28f50 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  M );.        ass
28f60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
28f70 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
28f80 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
28f90 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
28fa0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
28fb0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
28fc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28fd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28fe0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28ff0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
29000 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  M );.          r
29010 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29020 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
29030 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
29040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
29050 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
29060 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
29070 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
29080 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
29090 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  NC;.          pP
290a0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
290b0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
290c0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
290d0 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
290e0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
290f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
29100 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
29110 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
29120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29130 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
29140 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
29150 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
29160 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
29170 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
29180 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
29190 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
291a0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
291b0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
291c0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
291d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
291e0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
291f0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
29200 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
29210 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
29220 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
29230 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
29240 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
29250 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
29260 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
29270 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
29280 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
29290 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
292a0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
292b0 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
292c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
292d0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
292e0 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
292f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
29300 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
29310 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
29320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
29330 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
29340 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
29350 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
29360 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
29370 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
29380 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
29390 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20  writeable. This 
293a0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
293b0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a  called before .*
293c0 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  * making changes
293d0 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20   to a page. The 
293e0 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63  caller must chec
293f0 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  k the return val
29400 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66  ue .** of this f
29410 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63  unction and be c
29420 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68  areful not to ch
29430 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
29440 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68  ta unless .** th
29450 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29460 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
29470 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
29480 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
29490 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
294a0 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
294b0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
294c0 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
294d0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
294e0 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
294f0 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
29500 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
29510 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
29520 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
29530 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
29540 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
29550 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
29560 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
29570 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
29580 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
29590 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
295a0 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
295b0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
295c0 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f  rned.** as appro
295d0 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73  priate. Otherwis
295e0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
295f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29600 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
29610 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
29620 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
29630 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
29640 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
29650 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
29660 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
29670 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
29680 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
29690 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
296a0 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  ize);..  if( nPa
296b0 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
296c0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
296d0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
296e0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
296f0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
29700 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
29710 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
29720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
29730 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
29740 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
29750 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
29760 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
29770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
29780 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
29790 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
297a0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
297b0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
297c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
297d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
297e0 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
297f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
29800 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
29810 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
29820 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  C */..    /* Set
29830 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
29840 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
29850 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
29860 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
29870 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
29880 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
29890 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
298a0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
298b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
298c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
298d0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
298e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
298f0 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
29900 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
29910 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
29920 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
29930 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
29940 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
29950 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
29960 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
29970 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
29980 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
29990 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
299a0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
299b0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
299c0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
299d0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
299e0 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
299f0 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
29a00 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
29a10 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
29a20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29a30 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
29a40 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67  er, (int *)&nPag
29a50 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28  eCount);.    if(
29a60 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29a70 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
29a80 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
29a90 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
29aa0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
29ab0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
29ac0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
29ad0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
29ae0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
29af0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
29b00 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
29b10 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29b20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
29b30 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29b40 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
29b50 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
29b60 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
29b70 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
29b80 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
29b90 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
29ba0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
29bb0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
29bc0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
29bd0 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
29be0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
29bf0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
29c00 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
29c10 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
29c20 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
29c30 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
29c40 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
29c50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
29c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29c70 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
29c80 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
29c90 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29cb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
29cc0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
29cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29ce0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
29cf0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
29d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
29d10 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
29d20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
29d30 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
29d40 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nc);.           
29d50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
29d60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29d70 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
29d80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29d90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
29da0 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
29db0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
29dc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
29dd0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
29de0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
29df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
29e00 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
29e10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
29e20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
29e30 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
29e40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
29e50 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
29e60 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
29e70 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
29e80 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
29e90 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
29ea0 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
29eb0 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
29ec0 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
29ed0 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
29ee0 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
29ef0 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
29f00 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
29f10 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
29f20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
29f30 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
29f40 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
29f50 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
29f60 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
29f70 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
29f80 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
29f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
29fa0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
29fb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
29fc0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
29fd0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
29fe0 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
29ff0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  c==0 );.      fo
2a000 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
2a010 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
2a020 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
2a030 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
2a040 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
2a050 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
2a060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
2a070 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
2a080 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
2a090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2a0a0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
2a0b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a0c0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2a0d0 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
2a0e0 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
2a0f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2a100 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
2a110 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
2a120 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
2a130 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
2a140 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
2a150 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2a170 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
2a180 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
2a190 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
2a1a0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
2a1b0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
2a1c0 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
2a1d0 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
2a1e0 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
2a1f0 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
2a200 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
2a210 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
2a220 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
2a230 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a240 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
2a250 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
2a260 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2a270 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
2a280 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
2a290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
2a2a0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
2a2b0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
2a2c0 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
2a2d0 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
2a2e0 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
2a2f0 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
2a300 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
2a310 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
2a320 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2a330 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
2a340 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
2a350 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
2a360 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
2a370 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
2a380 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
2a390 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
2a3a0 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
2a3b0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
2a3c0 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
2a3d0 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
2a3e0 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
2a3f0 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
2a400 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
2a410 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
2a420 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
2a430 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
2a440 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
2a450 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
2a460 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
2a470 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
2a480 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
2a490 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
2a4a0 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
2a4b0 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
2a4c0 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
2a4d0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2a4e0 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
2a4f0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
2a500 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2a510 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
2a520 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2a530 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
2a540 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
2a550 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2a560 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
2a570 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
2a580 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
2a590 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
2a5a0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
2a5b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a5c0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
2a5d0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
2a5e0 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
2a5f0 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
2a600 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
2a610 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
2a620 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
2a630 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
2a640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2a650 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2a660 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
2a670 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
2a680 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a  atabase file .**
2a690 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
2a6a0 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62   stored as a 4-b
2a6b0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2a6c0 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20  nteger starting 
2a6d0 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73  at .** byte offs
2a6e0 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  et 24 of the pag
2a6f0 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  er file..**.** I
2a700 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f  f the isDirectMo
2a710 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  de flag is zero,
2a720 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
2a730 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
2a740 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
2a750 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
2a760 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
2a770 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a780 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
2a790 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2a7a0 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
2a7b0 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
2a7c0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
2a7d0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
2a7e0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
2a7f0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
2a800 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f  g may only be no
2a810 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69  n-zero if the li
2a820 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
2a830 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53  ed.** with the S
2a840 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2a850 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20  MIC_WRITE macro 
2a860 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73  defined. In this
2a870 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44   case,.** if isD
2a880 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  irect is non-zer
2a890 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  o, then the data
2a8a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64  base file is upd
2a8b0 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ated directly.**
2a8c0 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75   by writing an u
2a8d0 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  pdated version o
2a8e0 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61  f page 1 using a
2a8f0 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a   call to the .**
2a900 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2a910 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ) function..*/.s
2a920 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2a930 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2a940 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
2a950 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f  , int isDirectMo
2a960 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  de){.  int rc = 
2a970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
2a980 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69   Declare and ini
2a990 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74  tialize constant
2a9a0 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65   integer 'isDire
2a9b0 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  ct'. If the.  **
2a9c0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2a9d0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
2a9e0 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
2a9f0 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65  ild, then isDire
2aa00 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69  ct.  ** is initi
2aa10 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
2aa20 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
2aa30 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70  e isDirectMode p
2aa40 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f  arameter.  ** to
2aa50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
2aa60 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
2aa70 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
2aa80 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ero..  **.  ** T
2aa90 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2aaa0 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  if the atomic-wr
2aab0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2aac0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61   is not.  ** ena
2aad0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2aae0 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c  time, the compil
2aaf0 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20  er can omit the 
2ab00 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69  tests of.  ** 'i
2ab10 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20  sDirect' below, 
2ab20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2ab30 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e  lock enclosed in
2ab40 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69   the.  ** "if( i
2ab50 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69  sDirect )" condi
2ab60 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tion..  */.#ifnd
2ab70 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ab80 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20  _ATOMIC_WRITE.# 
2ab90 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f  define DIRECT_MO
2aba0 44 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69  DE 0.  assert( i
2abb0 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29  sDirectMode==0 )
2abc0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2abd0 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64  ETER(isDirectMod
2abe0 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  e);.#else.# defi
2abf0 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69  ne DIRECT_MODE i
2ac00 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64  sDirectMode.#end
2ac10 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
2ac20 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2ac30 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2ac40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
2ac50 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
2ac60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
2ac70 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
2ac80 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20  pPgHdr;         
2ac90 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65         /* Refere
2aca0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
2acb0 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f  .    u32 change_
2acc0 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20  counter;        
2acd0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
2ace0 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f  lue of change-co
2acf0 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a  unter field */..
2ad00 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2ad10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
2ad20 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ad30 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  fd) );..    /* O
2ad40 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
2ad50 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
2ad60 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
2ad70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2ad80 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
2ad90 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dr);.    assert(
2ada0 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63   pPgHdr==0 || rc
2adb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
2adc0 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f      /* If page o
2add0 6e 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73  ne was fetched s
2ade0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64  uccessfully, and
2adf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2ae00 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65  s not.    ** ope
2ae10 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74  rating in direct
2ae20 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65  -mode, make page
2ae30 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68   1 writable.  Wh
2ae40 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a  en not in .    *
2ae50 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70  * direct mode, p
2ae60 61 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20  age 1 is always 
2ae70 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e  held in cache an
2ae80 64 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65  d hence the Page
2ae90 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62  rGet().    ** ab
2aea0 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75  ove is always su
2aeb0 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65  ccessful - hence
2aec0 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72   the ALWAYS on r
2aed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20  c==SQLITE_OK..  
2aee0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49    */.    if( !DI
2aef0 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57  RECT_MODE && ALW
2af00 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  AYS(rc==SQLITE_O
2af10 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  K) ){.      rc =
2af20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2af30 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
2af40 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
2af50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2af60 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
2af70 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
2af80 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
2af90 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
2afa0 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65   */.      change
2afb0 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
2afc0 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
2afd0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2afe0 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67  rs);.      chang
2aff0 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
2b000 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
2b010 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
2b020 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
2b030 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20  ounter);..      
2b040 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
2b050 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
2b060 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
2b070 20 39 36 2e 2e 39 39 20 2a 2f 0a 20 20 20 20 20   96..99 */.     
2b080 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
2b090 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61  r*)pPgHdr->pData
2b0a0 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52  )+96, SQLITE_VER
2b0b0 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20  SION_NUMBER);.. 
2b0c0 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69       /* If runni
2b0d0 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64  ng in direct mod
2b0e0 65 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e  e, write the con
2b0f0 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20  tents of page 1 
2b100 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a  to the file. */.
2b110 20 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54        if( DIRECT
2b120 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20  _MODE ){.       
2b130 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75   const void *zBu
2b140 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74  f = pPgHdr->pDat
2b150 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  a;.        asser
2b160 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  t( pPager->dbFil
2b170 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20  eSize>0 );.     
2b180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2b190 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
2b1a0 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
2b1b0 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
2b1c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2b1d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b1e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
2b1f0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
2b200 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2b210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b220 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
2b230 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20  CountDone = 1;. 
2b240 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2b250 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
2b260 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2b270 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
2b280 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
2b290 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b2a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
2b2b0 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  c the pager file
2b2c0 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69   to disk. This i
2b2d0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e  s a no-op for in
2b2e0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a  -memory files.**
2b2f0 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74   or pages with t
2b300 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
2b310 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
2b320 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  If successful, o
2b330 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61  r called on a pa
2b340 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74  ger for which it
2b350 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69   is a no-op, thi
2b360 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
2b370 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
2b380 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49   Otherwise, an I
2b390 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2b3a0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
2b3b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
2b3c0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
2b3d0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2b400 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73  rn code */.  ass
2b410 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
2b420 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
2b430 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
2b440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2b450 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
2b460 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2b470 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
2b480 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
2b490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b4a0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
2b4b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
2b4c0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
2b4d0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
2b4e0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
2b4f0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
2b500 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
2b510 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
2b520 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
2b530 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
2b540 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
2b550 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
2b560 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
2b570 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
2b580 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
2b590 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
2b5a0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
2b5b0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
2b5c0 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  res that:.**.** 
2b5d0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2b5e0 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
2b5f0 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c  nter is updated,
2b600 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72  .**   * the jour
2b610 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75  nal is synced (u
2b620 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63  nless the atomic
2b630 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2b640 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a  ion is used),.**
2b650 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70     * all dirty p
2b660 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
2b670 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b680 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74   file, .**   * t
2b690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b6a0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69   is truncated (i
2b6b0 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64  f required), and
2b6c0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
2b6d0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
2b6e0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  . .**.** The onl
2b6f0 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d  y thing that rem
2b700 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
2b710 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2b720 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a  s to finalize .*
2b730 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63  * (delete, trunc
2b740 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
2b750 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74  first part of) t
2b760 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b770 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  (or .** delete t
2b780 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2b790 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
2b7a0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
2b7b0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
2b7c0 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
2b7d0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
2b7e0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
2b7f0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
2b800 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
2b810 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
2b820 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
2b830 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
2b840 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
2b850 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
2b860 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2b870 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
2b880 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
2b890 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
2b8a0 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
2b8b0 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
2b8c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b8d0 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
2b8e0 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
2b8f0 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
2b900 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2b910 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
2b920 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2b930 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
2b940 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
2b950 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2b960 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2b970 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
2b980 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20  har *zMaster,   
2b990 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
2b9a0 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73  ot NULL, the mas
2b9b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
2b9c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63   */.  int noSync
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2b9f0 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20   omit the xSync 
2ba00 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a  on the db file *
2ba10 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
2ba20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2ba30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2ba40 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
2ba50 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73  he dbOrigSize is
2ba60 20 6e 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f   never set if jo
2ba70 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a  urnal_mode=OFF *
2ba80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2ba90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2baa0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2bab0 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72  DE_OFF || pPager
2bac0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
2bad0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72  );..  /* If a pr
2bae0 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ior error occurr
2baf0 65 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20  ed, report that 
2bb00 65 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a  error again. */.
2bb10 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2bb20 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
2bb30 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2bb40 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54  rCode;..  PAGERT
2bb50 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
2bb60 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
2bb70 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
2bb80 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
2bb90 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2bba0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
2bbb0 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66  >dbSize));..  if
2bbc0 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
2bbd0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b  r->dbModified ){
2bbe0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2bbf0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2bc00 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
2bc10 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2bc20 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
2bc30 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
2bc40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
2bc50 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73  alled, it is mos
2bc60 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f  tly a no-op.  Ho
2bc70 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a  wever, any.    *
2bc80 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67  * backup in prog
2bc90 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65  ress needs to be
2bca0 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20   restarted..    
2bcb0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  */.    sqlite3Ba
2bcc0 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
2bcd0 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
2bce0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
2bcf0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
2bd00 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d  YNCED && pPager-
2bd10 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a  >dbModified ){..
2bd20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
2bd30 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74  wing block updat
2bd40 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
2bd50 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68  unter. Exactly h
2bd60 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ow it.    ** doe
2bd70 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
2bd80 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
2bd90 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
2bda0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
2bdb0 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c      ** was enabl
2bdc0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2bdd0 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20  me, and if this 
2bde0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74  transaction meet
2bdf0 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75  s the .    ** ru
2be00 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
2be10 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
2be20 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion: .    **.   
2be30 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c   **    * The fil
2be40 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
2be50 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
2be60 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
2be70 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
2be80 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
2be90 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a  size, and .    *
2bea0 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d  *    * This comm
2beb0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
2bec0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
2bed0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
2bee0 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63      **    * Exac
2bef0 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
2bf00 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
2bf10 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
2bf20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
2bf30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2bf40 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2bf50 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20  was not enabled 
2bf60 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2bf70 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
2bf80 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2bf90 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
2bfa0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2bfb0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2bfc0 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  nge.    ** count
2bfd0 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
2bfe0 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
2bff0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
2c000 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
2c010 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c    ** is not appl
2c020 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74  icable to this t
2c030 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c  ransaction, call
2c040 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
2c050 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74  reate().    ** t
2c060 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
2c070 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
2c080 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63   actually been c
2c090 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c  reated, then cal
2c0a0 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69  l.    ** pager_i
2c0b0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2c0c0 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2c0d0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2c0e0 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20   in indirect.   
2c0f0 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a   ** mode. .    *
2c100 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  *.    ** Otherwi
2c110 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d  se, if the optim
2c120 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20  ization is both 
2c130 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c  enabled and appl
2c140 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74  icable,.    ** t
2c150 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
2c160 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2c170 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2c180 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2c190 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65  .    ** in 'dire
2c1a0 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
2c1b0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2c1c0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
2c1d0 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  er be.    ** cre
2c1e0 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
2c1f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
2c200 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2c210 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2c220 49 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70  ITE.    PgHdr *p
2c230 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
2c240 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2c250 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
2c260 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2c270 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2c280 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  F );.    if( !zM
2c290 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
2c2a0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
2c2b0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2c2c0 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
2c2d0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
2c2e0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
2c2f0 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72  ->dbSize>=pPager
2c300 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20  ->dbFileSize.   
2c310 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20    && (0==(pPg = 
2c320 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2c330 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2c340 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70  PCache)) || 0==p
2c350 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  Pg->pDirty).    
2c360 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ){.      /* Upda
2c370 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
2c380 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
2c390 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
2c3a0 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
2c3b0 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
2c3c0 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
2c3d0 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ify the in-memor
2c3e0 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
2c3f0 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20 20   of page 1 .    
2c400 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
2c410 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
2c420 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
2c430 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
2c440 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63   .      ** direc
2c450 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
2c460 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
2c470 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
2c480 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20  write .      ** 
2c490 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
2c4a0 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
2c4b0 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
2c4c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2c4d0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2c4e0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2c4f0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ger, 1);.    }el
2c500 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
2c510 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2c520 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
2c530 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2c540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c550 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2c560 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c570 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
2c580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c       }.    }.#el
2c590 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  se.    rc = page
2c5a0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c5b0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
2c5c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2c5d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c5e0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2c5f0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2c600 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
2c610 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
2c620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
2c630 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
2c640 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69  pages.    ** bei
2c650 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
2c660 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
2c670 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
2c680 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
2c690 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
2c6a0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2c6b0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
2c6c0 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
2c6d0 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e  ** Before readin
2c6e0 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68  g the pages with
2c6f0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61   page numbers la
2c700 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
2c710 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61     ** current va
2c720 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
2c730 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20  ize, set dbSize 
2c740 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
2c750 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74  e.    ** that it
2c760 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
2c770 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
2c780 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
2c790 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c  , the.    ** cal
2c7a0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2c7b0 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a  erGet() return z
2c7c0 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74  eroed pages inst
2c7d0 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72  ead of .    ** r
2c7e0 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
2c7f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c800 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
2c810 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  * When journal_m
2c820 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f  ode==OFF the dbO
2c830 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79  rigSize is alway
2c840 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a  s zero, so this.
2c850 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76      ** block nev
2c860 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e  er runs if journ
2c870 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20  al_mode=OFF..   
2c880 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2c890 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c8a0 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2c8b0 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72  r->dbSize<pPager
2c8c0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
2c8d0 20 20 20 26 26 20 41 4c 57 41 59 53 28 70 50 61     && ALWAYS(pPa
2c8e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2c8f0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2c900 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20 29 7b 0a  ODE_OFF).    ){.
2c910 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20        Pgno i;   
2c920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c940 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2c950 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  able */.      co
2c960 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
2c970 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
2c980 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
2c990 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
2c9a0 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
2c9b0 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
2c9c0 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  ->dbSize;       
2c9d0 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67  /* Database imag
2c9e0 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20  e size */ .     
2c9f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2ca00 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
2ca10 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Size;.      for(
2ca20 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d   i=dbSize+1; i<=
2ca30 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2ca40 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
2ca50 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
2ca60 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
2ca70 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
2ca80 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
2ca90 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20            PgHdr 
2caa0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
2cab0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a      /* Page to j
2cac0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20  ournal */.      
2cad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cae0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2caf0 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
2cb00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2cb10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2cb20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2cb30 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
2cb40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2cb50 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
2cb60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cb70 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2cb80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2cb90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cba0 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2cbb0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2cbc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
2cbd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
2cbe0 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a  bSize = dbSize;.
2cbf0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2cc00 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
2cc10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
2cc20 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
2cc30 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d  nal file. If a m
2cc40 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f  aster .    ** jo
2cc50 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2cc60 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2cc70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2cc80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20  journal file, . 
2cc90 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73     ** or if zMas
2cca0 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20  ter is NULL (no 
2ccb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c  master journal),
2ccc0 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
2ccd0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
2cce0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
2ccf0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
2cd00 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
2cd10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cd20 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2cd30 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2cd40 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  xit;..    /* Syn
2cd50 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2cd60 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69  le. If the atomi
2cd70 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
2cd80 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20  ation is being. 
2cd90 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73     ** used, this
2cda0 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63   call will not c
2cdb0 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  reate the journa
2cdc0 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72  l file or perfor
2cdd0 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61  m any.    ** rea
2cde0 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  l IO..    */.   
2cdf0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2ce00 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
2ce10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ce20 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2ce30 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2ce40 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
2ce50 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2ce60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ce70 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  e. */.    rc = p
2ce80 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2ce90 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68  ist(sqlite3Pcach
2cea0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2ceb0 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
2cec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ced0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2cee0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2cef0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
2cf00 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  .      goto comm
2cf10 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2cf20 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
2cf30 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
2cf40 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
2cf50 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  he);..    /* If 
2cf60 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
2cf70 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
2cf80 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74   size as the dat
2cf90 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20  abase image,.   
2cfa0 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
2cfb0 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
2cfc0 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
2cfd0 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
2cfe0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
2cff0 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67  er->dbSize!=pPag
2d000 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2d010 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65  {.      Pgno nNe
2d020 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  w = pPager->dbSi
2d030 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62  ze - (pPager->db
2d040 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  Size==PAGER_MJ_P
2d050 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
2d060 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d070 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2d080 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2d090 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
2d0a0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
2d0b0 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  nNew);.      if(
2d0c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d0d0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2d0e0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2d0f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c   }..    /* Final
2d100 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  ly, sync the dat
2d110 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2d120 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2d130 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e  noSync && !noSyn
2d140 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
2d150 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2d160 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2d170 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
2d180 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
2d190 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
2d1a0 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
2d1b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2d1c0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
2d1d0 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
2d1e0 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  ne_exit:.  retur
2d1f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2d200 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
2d210 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
2d220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d230 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  has been complet
2d240 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74  ely.** updated t
2d250 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68  o reflect the ch
2d260 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
2d270 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
2d280 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e  ction and.** syn
2d290 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ced to disk. The
2d2a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
2d2b0 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68  ill exists in th
2d2c0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
2d2d0 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66  * though, and if
2d2e0 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
2d2f0 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
2d300 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  it will eventual
2d310 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73  ly.** be used as
2d320 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
2d330 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2d340 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65  ransaction rolle
2d350 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
2d360 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  is function fina
2d370 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
2d380 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62  l file, either b
2d390 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20  y deleting, .** 
2d3a0 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61  truncating or pa
2d3b0 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20  rtially zeroing 
2d3c0 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63  it, so that it c
2d3d0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a  annot be used .*
2d3e0 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61  * for hot-journa
2d3f0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65  l rollback. Once
2d400 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68   this is done th
2d410 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2d420 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20  .** irrevocably 
2d430 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
2d440 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2d450 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
2d460 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2d470 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a  d and the pager.
2d480 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68  ** moves into th
2d490 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f  e error state. O
2d4a0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
2d4b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2d4c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2d4d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
2d4e0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
2d4f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2d500 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2d510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2d520 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
2d530 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
2d540 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2d550 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65  led if a prior e
2d560 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
2d570 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28  d..  ** But if (
2d580 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2d590 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20  error elsewhere 
2d5a0 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69  in the system) i
2d5b0 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20  t does get.  ** 
2d5c0 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74  called, just ret
2d5d0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
2d5e0 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20  or code without 
2d5f0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
2d600 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2d610 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2d620 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
2d630 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
2d640 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2d650 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
2d660 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
2d670 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
2d680 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
2d690 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e  SERVED state. An
2d6a0 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20  d indeed SQLite 
2d6b0 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e  never does this.
2d6c0 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20   But it is.  ** 
2d6d0 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68 69  nice to have thi
2d6e0 73 20 64 65 66 65 6e 73 69 76 65 20 74 65 73 74  s defensive test
2d6f0 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20   here anyway..  
2d700 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2d710 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
2d720 45 52 5f 52 45 53 45 52 56 45 44 29 20 29 20 72  ER_RESERVED) ) r
2d730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2d740 4f 52 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74  OR;..  /* An opt
2d750 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68  imization. If th
2d760 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e  e database was n
2d770 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
2d780 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a  fied during.  **
2d790 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2d7a0 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20  n, the pager is 
2d7b0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2d7c0 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73  sive-mode and is
2d7d0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73  .  ** using pers
2d7e0 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c  istent journals,
2d7f0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2d800 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2d810 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74    **.  ** The st
2d820 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2d830 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
2d840 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  y contains a sin
2d850 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  gle journal .  *
2d860 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68  * header with th
2d870 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74  e nRec field set
2d880 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61   to 0. If such a
2d890 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64   journal is used
2d8a0 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   as.  ** a hot-j
2d8b0 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f  ournal during ho
2d8c0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2d8d0 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69  ck, 0 changes wi
2d8e0 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20  ll be made.  ** 
2d8f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2d900 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69  file. So there i
2d910 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72  s no need to zer
2d920 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  o the journal . 
2d930 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63   ** header. Sinc
2d940 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
2d950 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
2d960 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
2d970 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20  ed.  ** to drop 
2d980 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72  any locks either
2d990 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
2d9a0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
2d9b0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  =0 && pPager->ex
2d9c0 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
2d9d0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
2d9e0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2d9f0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2da00 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  T.  ){.    asser
2da10 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
2da20 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
2da30 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
2da40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2da50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41  TE_OK;.  }..  PA
2da60 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49  GERTRACE(("COMMI
2da70 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
2da80 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73  (pPager)));.  as
2da90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2daa0 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
2dab0 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70  D || MEMDB || !p
2dac0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2dad0 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  d );.  rc = page
2dae0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
2daf0 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  n(pPager, pPager
2db00 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20  ->setMaster);.  
2db10 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
2db20 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2db30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
2db40 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54  k all changes. T
2db50 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
2db60 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
2db70 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a  SHARED mode..**.
2db80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2db90 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61   performs two ta
2dba0 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  sks:.**.**   1) 
2dbb0 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  It rolls back th
2dbc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2dbd0 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61  restoring all da
2dbe0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
2dbf0 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f  .**      in-memo
2dc00 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74  ry cache pages t
2dc10 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79  o the state they
2dc20 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68   were in when th
2dc30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e transaction.**
2dc40 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64        was opened
2dc50 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74  , and.**   2) It
2dc60 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a   finalizes the j
2dc70 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20  ournal file, so 
2dc80 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75  that it is not u
2dc90 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20  sed for hot.**  
2dca0 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20      rollback at 
2dcb0 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  any point in the
2dcc0 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73   future..**.** s
2dcd0 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
2dce0 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63  llowing qualific
2dcf0 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20  ations:.**.** * 
2dd00 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
2dd10 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  ile is not yet o
2dd20 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
2dd30 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2dd40 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79  ,.**   then only
2dd50 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65   (2) is performe
2dd60 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
2dd70 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72  there is no jour
2dd80 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f  nal file.**   to
2dd90 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a   roll back..**.*
2dda0 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72  * * If in an err
2ddb0 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
2ddc0 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  han SQLITE_FULL,
2ddd0 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69   then task (1) i
2dde0 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65  s .**   performe
2ddf0 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  d. If successful
2de00 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61  , task (2). Rega
2de10 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75  rdless of the ou
2de20 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69  tcome.**   of ei
2de30 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20  ther, the error 
2de40 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  state error code
2de50 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
2de60 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  the caller.**   
2de70 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c  (i.e. either SQL
2de80 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
2de90 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
2dea0 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67  .** * If the pag
2deb0 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52  er is in PAGER_R
2dec0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
2ded0 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e  hen attempt (1).
2dee0 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72   Whether.**   or
2def0 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63   not (1) is succ
2df00 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74  ussful, also att
2df10 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63  empt (2). If suc
2df20 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
2df30 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  **   SQLITE_OK. 
2df40 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72  Otherwise, enter
2df50 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2df60 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
2df70 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f  first .**   erro
2df80 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72  r code encounter
2df90 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ed. .**.**   In 
2dfa0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2dfb0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61  is no chance tha
2dfc0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  t the database w
2dfd0 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a  as written to. .
2dfe0 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20  **   So is safe 
2dff0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
2e000 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65  journal file eve
2e010 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63  n if the playbac
2e020 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69  k .**   (operati
2e030 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f  on 1) failed. Ho
2e040 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20  wever the pager 
2e050 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65  must enter the e
2e060 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20  rror state.**   
2e070 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  as the contents 
2e080 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
2e090 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73   cache are now s
2e0a0 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20  uspect..**.** * 
2e0b0 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50  Finally, if in P
2e0c0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73  AGER_EXCLUSIVE s
2e0d0 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d  tate, then attem
2e0e0 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20  pt (1). Only.** 
2e0f0 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66    attempt (2) if
2e100 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66   (1) is successf
2e110 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ul. Return SQLIT
2e120 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2e130 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69  ul,.**   otherwi
2e140 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  se enter the err
2e150 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74  or state and ret
2e160 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
2e170 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  de from the .** 
2e180 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74    failing operat
2e190 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  ion..**.**   In 
2e1a0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61  this case the da
2e1b0 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20  tabase file may 
2e1c0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
2e1d0 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a  n to. So if the.
2e1e0 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70  **   playback op
2e1f0 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20  eration did not 
2e200 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64  succeed it would
2e210 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
2e220 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68  finalize.**   th
2e230 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
2e240 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  It needs to be l
2e250 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
2e260 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a  system so that.*
2e270 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  *   some other p
2e280 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69  rocess can use i
2e290 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  t to restore the
2e2a0 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20   database state 
2e2b0 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75  (by.**   hot-jou
2e2c0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a  rnal rollback)..
2e2d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e2e0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
2e2f0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2e300 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e320 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2e330 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43  e */.  PAGERTRAC
2e340 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E(("ROLLBACK %d\
2e350 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2e360 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70 50  er)));.  if( !pP
2e370 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2e380 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
2e390 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2e3a0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
2e3b0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2e3c0 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2e3d0 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
2e3e0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2e3f0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
2e400 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
2e410 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
2e420 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2e430 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
2e440 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
2e450 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
2e460 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2e470 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2e480 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2e490 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
2e4a0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2e4b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
2e4c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2e4d0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
2e4e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
2e4f0 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
2e500 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2e510 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2e520 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
2e530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e540 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
2e550 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
2e560 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2e570 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e580 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2e590 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
2e5a0 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
2e5b0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
2e5c0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
2e5d0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
2e5e0 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
2e5f0 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
2e600 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
2e610 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
2e620 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
2e630 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
2e640 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
2e650 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
2e660 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
2e670 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2e680 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
2e690 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
2e6a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e6b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2e6c0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2e6d0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
2e6e0 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
2e6f0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
2e700 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
2e710 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
2e720 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  ble..*/.u8 sqlit
2e730 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
2e740 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
2e750 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2e760 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
2e770 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2e780 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
2e790 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
2e7a0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2e7b0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
2e7c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e7d0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e7e0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2e7f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e810 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65   the approximate
2e820 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2e830 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65   of memory curre
2e840 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20  ntly.** used by 
2e850 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74  the pager and it
2e860 73 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63  s associated cac
2e870 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  he..*/.int sqlit
2e880 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50  e3PagerMemUsed(P
2e890 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e8a0 20 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65   int perPageSize
2e8b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
2e8c0 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  ize + pPager->nE
2e8d0 78 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74  xtra + 20;.  ret
2e8e0 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a  urn perPageSize*
2e8f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
2e900 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
2e910 50 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20  PCache).        
2e920 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c     + sqlite3Mall
2e930 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  ocSize(pPager);.
2e940 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e950 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
2e960 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2e970 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
2e980 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e990 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
2e9a0 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  DbPage *pPage){.
2e9b0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e9c0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
2e9d0 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69  nt(pPage);.}..#i
2e9e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2e9f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2ea00 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2ea10 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
2ea20 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
2ea30 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
2ea40 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
2ea50 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
2ea60 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
2ea70 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
2ea80 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
2ea90 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d  pPCache);.  a[1]
2eaa0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2eab0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2eac0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2ead0 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  2] = sqlite3Pcac
2eae0 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70  heGetCachesize(p
2eaf0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2eb00 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
2eb10 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20  ->dbSizeValid ? 
2eb20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62  (int) pPager->db
2eb30 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34  Size : -1;.  a[4
2eb40 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
2eb50 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
2eb60 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
2eb70 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
2eb80 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
2eb90 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
2eba0 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64  8] = 0;  /* Used
2ebb0 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e   to be pPager->n
2ebc0 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d  Ovfl */.  a[9] =
2ebd0 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
2ebe0 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
2ebf0 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
2ec00 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
2ec10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2ec20 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2ec30 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
2ec40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2ec50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65  agerIsMemdb(Page
2ec60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2ec70 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f  turn MEMDB;.}../
2ec80 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2ec90 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61  there are at lea
2eca0 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61  st nSavepoint sa
2ecb0 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49  vepoints open. I
2ecc0 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63  f there are.** c
2ecd0 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68  urrently less th
2ece0 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f  an nSavepoints o
2ecf0 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f  pen, then open o
2ed00 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
2ed10 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65  oints.** to make
2ed20 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e   up the differen
2ed30 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65  ce. If the numbe
2ed40 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
2ed50 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71  is already.** eq
2ed60 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e  ual to nSavepoin
2ed70 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
2ed80 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2ed90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
2eda0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
2edb0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
2edc0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
2edd0 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  If an error .** 
2ede0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
2edf0 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75  ning the sub-jou
2ee00 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
2ee10 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2ee20 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
2ee30 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
2ee40 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
2ee50 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
2ee60 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
2ee70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65  Pager, int nSave
2ee80 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
2ee90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eeb0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2eec0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  de */.  int nCur
2eed0 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  rent = pPager->n
2eee0 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
2eef0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
2ef00 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
2ef10 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76  s */..  if( nSav
2ef20 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20  epoint>nCurrent 
2ef30 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
2ef40 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
2ef50 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
2ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef70 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2ef80 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
2ef90 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
2efa0 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *aNew;          
2efb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2efc0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
2efd0 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
2efe0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f000 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2f010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2f020 2f 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  /..    rc = sqli
2f030 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2f040 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
2f050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2f060 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
2f070 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65  /* Grow the Page
2f080 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
2f090 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63  ay using realloc
2f0a0 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  (). Return SQLIT
2f0b0 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69  E_NOMEM.    ** i
2f0c0 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
2f0d0 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73   fails. Otherwis
2f0e0 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20  e, zero the new 
2f0f0 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20  portion in case 
2f100 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63  a .    ** malloc
2f110 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
2f120 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67  while populating
2f130 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e   it in the for(.
2f140 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a  ..) loop below..
2f150 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20      */.    aNew 
2f160 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  = (PagerSavepoin
2f170 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  t *)sqlite3Reall
2f180 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  oc(.        pPag
2f190 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20  er->aSavepoint, 
2f1a0 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
2f1b0 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e  point)*nSavepoin
2f1c0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
2f1d0 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
2f1e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f1f0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
2f200 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72  emset(&aNew[nCur
2f210 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65  rent], 0, (nSave
2f220 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20  point-nCurrent) 
2f230 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  * sizeof(PagerSa
2f240 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70  vepoint));.    p
2f250 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2f260 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50  t = aNew;.    pP
2f270 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2f280 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a   = nSavepoint;..
2f290 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
2f2a0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
2f2b0 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75  nt structures ju
2f2c0 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f  st allocated. */
2f2d0 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72  .    for(ii=nCur
2f2e0 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f  rent; ii<nSavepo
2f2f0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
2f300 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67    aNew[ii].nOrig
2f310 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
2f320 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
2f330 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
2f340 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
2f350 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b  ){.        aNew[
2f360 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50  ii].iOffset = pP
2f370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2f380 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f390 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e         aNew[ii].
2f3a0 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41  iOffset = JOURNA
2f3b0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
2f3c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f3d0 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63  aNew[ii].iSubRec
2f3e0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
2f3f0 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69  ec;.      aNew[i
2f400 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
2f410 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
2f420 72 65 61 74 65 28 6e 50 61 67 65 29 3b 0a 20 20  reate(nPage);.  
2f430 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69      if( !aNew[ii
2f440 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29  ].pInSavepoint )
2f450 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f460 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2f470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2f480 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
2f490 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
2f4a0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2f4b0 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72  opened. */.    r
2f4c0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2f4d0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
2f4e0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
2f4f0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
2f500 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2f510 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2f520 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f530 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
2f540 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   or release (com
2f550 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74  mit) a savepoint
2f560 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  ..** The savepoi
2f570 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72  nt to release or
2f580 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e   rollback need n
2f590 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72  ot be the most r
2f5a0 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61  ecently .** crea
2f5b0 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ted savepoint..*
2f5c0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f  *.** Parameter o
2f5d0 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  p is always eith
2f5e0 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
2f5f0 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49  LBACK or SAVEPOI
2f600 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49  NT_RELEASE..** I
2f610 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
2f620 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
2f630 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74  release and dest
2f640 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
2f650 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  t with.** index 
2f660 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69  iSavepoint. If i
2f670 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
2f680 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f  OLLBACK, then ro
2f690 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
2f6a0 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
2f6b0 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74  occurred since t
2f6c0 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76  he specified sav
2f6d0 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
2f6e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  ed..**.** The sa
2f6f0 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62  vepoint to rollb
2f700 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69  ack or release i
2f710 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
2f720 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53  parameter .** iS
2f730 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75  avepoint. A valu
2f740 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20  e of 0 means to 
2f750 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f  operate on the o
2f760 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
2f770 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74  nt.** (the first
2f780 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c   created). A val
2f790 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61  ue of (Pager.nSa
2f7a0 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73  vepoint-1) means
2f7b0 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74   operate.** on t
2f7c0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2f7d0 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
2f7e0 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e  nt. If iSavepoin
2f7f0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
2f800 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76  n.** (Pager.nSav
2f810 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20  epoint-1), then 
2f820 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f830 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2f840 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  If a negative va
2f850 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  lue is passed to
2f860 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2f870 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
2f880 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2f890 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
2f8a0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
2f8b0 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  t to calling .**
2f8c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2f8d0 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20  lback() because 
2f8e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
2f8f0 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  es not terminate
2f900 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
2f910 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ion or unlock th
2f920 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a  e database, it j
2f930 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65  ust restores the
2f940 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
2f950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2f960 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
2f970 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ate. .**.** In a
2f980 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76  ny case, all sav
2f990 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20  epoints with an 
2f9a0 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
2f9b0 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a  an iSavepoint .*
2f9c0 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e  * are destroyed.
2f9d0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
2f9e0 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20  lease operation 
2f9f0 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
2fa00 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e  ELEASE),.** then
2fa10 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65   savepoint iSave
2fa20 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65  point is also de
2fa30 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  stroyed..**.** T
2fa40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2fa50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2fa60 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79  OMEM if a memory
2fa70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2fa80 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65  s,.** or an IO e
2fa90 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
2faa0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2fab0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
2fac0 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69  ck a .** savepoi
2fad0 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73  nt. If no errors
2fae0 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
2faf0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
2fb00 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  / .int sqlite3Pa
2fb10 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67  gerSavepoint(Pag
2fb20 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2fb30 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
2fb40 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
2fb50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2fb60 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
2fb70 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
2fb80 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2fb90 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  LBACK );.  asser
2fba0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
2fbb0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
2fbc0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20  T_ROLLBACK );.. 
2fbd0 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
2fbe0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2fbf0 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  nt ){.    int ii
2fc00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2fc10 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2fc20 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65  e */.    int nNe
2fc30 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  w;          /* N
2fc40 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69  umber of remaini
2fc50 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66  ng savepoints af
2fc60 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a  ter this op. */.
2fc70 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
2fc80 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65  ut how many save
2fc90 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c  points will stil
2fca0 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65  l be active afte
2fcb0 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70  r this.    ** op
2fcc0 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74  eration. Store t
2fcd0 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65  his value in nNe
2fce0 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73  w. Then free res
2fcf0 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65  ources associate
2fd00 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  d .    ** with a
2fd10 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68  ny savepoints th
2fd20 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  at are destroyed
2fd30 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
2fd40 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  on..    */.    n
2fd50 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  New = iSavepoint
2fd60 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50 4f   + (( op==SAVEPO
2fd70 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f 20  INT_RELEASE ) ? 
2fd80 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72 28  0 : 1);.    for(
2fd90 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67  ii=nNew; ii<pPag
2fda0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
2fdb0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ii++){.      sql
2fdc0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
2fdd0 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  y(pPager->aSavep
2fde0 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65  oint[ii].pInSave
2fdf0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  point);.    }.  
2fe00 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
2fe10 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20  oint = nNew;..  
2fe20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2fe30 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65  a release of the
2fe40 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70   outermost savep
2fe50 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a  oint, truncate .
2fe60 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
2fe70 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62  ournal to zero b
2fe80 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f  ytes in size. */
2fe90 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
2fea0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29  EPOINT_RELEASE )
2feb0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65 77  {.      if( nNew
2fec0 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ==0 && isOpen(pP
2fed0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2fee0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74         /* Only t
2fef0 72 75 6e 63 61 74 65 20 69 66 20 69 74 20 69 73  runcate if it is
2ff00 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75   an in-memory su
2ff10 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
2ff20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2ff30 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
2ff40 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2ff50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ff60 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
2ff70 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29  pPager->sjfd, 0)
2ff80 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2ff90 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2ffa0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  K );.        }. 
2ffb0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2ffc0 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  SubRec = 0;.    
2ffd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a    }.    }.    /*
2ffe0 20 45 6c 73 65 20 74 68 69 73 20 69 73 20 61 20   Else this is a 
2fff0 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
30000 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65  on, playback the
30010 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70   specified savep
30020 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20  oint..    ** If 
30030 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66  this is a temp-f
30040 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69  ile, it is possi
30050 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ble that the jou
30060 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20  rnal file has.  
30070 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65    ** not yet bee
30080 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69  n opened. In thi
30090 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76  s case there hav
300a0 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
300b0 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  s to.    ** the 
300c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73  database file, s
300d0 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f  o the playback o
300e0 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  peration can be 
300f0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a  skipped..    */.
30100 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 73 4f      else if( isO
30110 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
30120 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53   ){.      PagerS
30130 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
30140 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29  oint = (nNew==0)
30150 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76  ?0:&pPager->aSav
30160 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a  epoint[nNew-1];.
30170 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30180 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
30190 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 65 70  t(pPager, pSavep
301a0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73  oint);.      ass
301b0 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44  ert(rc!=SQLITE_D
301c0 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ONE);.    }.  . 
301d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
301e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
301f0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
30200 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
30210 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
30220 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
30230 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
30240 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
30250 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
30260 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
30270 20 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20   Return the VFS 
30280 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
30290 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  e pager..*/.cons
302a0 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73  t sqlite3_vfs *s
302b0 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50  qlite3PagerVfs(P
302c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
302d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
302e0 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pVfs;.}../*.** R
302f0 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68  eturn the file h
30300 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61  andle for the da
30310 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
30320 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
30330 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
30340 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c  might return NUL
30350 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61  L if the file ha
30360 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65  s.** not yet bee
30370 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  n opened..*/.sql
30380 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74  ite3_file *sqlit
30390 65 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65  e3PagerFile(Page
303a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
303b0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b  turn pPager->fd;
303c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
303d0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
303e0 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
303f0 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
30400 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
30410 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
30420 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
30430 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
30440 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
30450 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
30460 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
30470 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
30480 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
30490 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
304a0 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
304b0 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
304c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
304d0 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
304e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
304f0 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
30500 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
30510 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
30520 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65 74 72  *.** Set or retr
30530 69 65 76 65 20 74 68 65 20 63 6f 64 65 63 20 66  ieve the codec f
30540 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
30550 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
30560 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
30570 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
30580 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
30590 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
305a0 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
305b0 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
305c0 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
305d0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  int),.  void (*x
305e0 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
305f0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
30600 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  c.){.  if( pPage
30610 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20  r->xCodecFree ) 
30620 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
30630 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ee(pPager->pCode
30640 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  c);.  pPager->xC
30650 6f 64 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6d  odec = pPager->m
30660 65 6d 44 62 20 3f 20 30 20 3a 20 78 43 6f 64 65  emDb ? 0 : xCode
30670 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  c;.  pPager->xCo
30680 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43  decSizeChng = xC
30690 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20  odecSizeChng;.  
306a0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
306b0 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b  ee = xCodecFree;
306c0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
306d0 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61  c = pCodec;.  pa
306e0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50  gerReportSize(pP
306f0 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ager);.}.static 
30700 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
30710 65 72 47 65 74 43 6f 64 65 63 28 50 61 67 65 72  erGetCodec(Pager
30720 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
30730 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  urn pPager->pCod
30740 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ec;.}.#endif..#i
30750 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30760 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
30770 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
30780 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e   pPg to location
30790 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
307a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  e..**.** There m
307b0 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
307c0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
307d0 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
307e0 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28  ted at.** pgno (
307f0 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50  which we call pP
30800 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61  gOld) though tha
30810 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65  t page is allowe
30820 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61  d to be.** in ca
30830 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  che.  If the pag
30840 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
30850 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
30860 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
30870 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
30880 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
30890 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
308a0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
308b0 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
308c0 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
308d0 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
308e0 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
308f0 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
30900 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
30910 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
30920 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
30930 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
30940 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
30950 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
30960 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
30970 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
30980 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
30990 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
309a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
309b0 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
309c0 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
309d0 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
309e0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
309f0 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
30a00 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
30a10 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
30a20 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
30a30 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
30a40 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
30a50 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
30a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
30a70 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  active)..**.** I
30a80 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  f the fourth arg
30a90 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c  ument, isCommit,
30aa0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
30ab0 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
30ac0 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61  being.** moved a
30ad0 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61  s part of a data
30ae0 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74  base reorganizat
30af0 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ion just before 
30b00 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
30b10 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  .** is being com
30b20 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20  mitted. In this 
30b30 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72  case, it is guar
30b40 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
30b50 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a  database page .*
30b60 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20  * pPg refers to 
30b70 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
30b80 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74  ten to again wit
30b90 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
30ba0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
30bb0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
30bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30bd0 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
30be0 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
30bf0 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68  r.** occurs. Oth
30c00 65 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72  erwise, it retur
30c10 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
30c20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
30c30 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
30c40 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
30c50 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
30c60 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
30c70 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
30c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30c90 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
30ca0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
30cb0 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
30cc0 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Pgno = 0;       
30cd0 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20  /* Old value of 
30ce0 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79  pPg->pgno, if sy
30cf0 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a  nc is required *
30d00 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
30d30 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67  */.  Pgno origPg
30d40 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
30d50 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    /* The origina
30d60 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  l page number */
30d70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
30d80 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
30d90 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   In order to be 
30da0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
30db0 2c 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  , an in-memory d
30dc0 61 74 61 62 61 73 65 20 6d 75 73 74 20 6a 6f 75  atabase must jou
30dd0 72 6e 61 6c 0a 20 20 2a 2a 20 74 68 65 20 70 61  rnal.  ** the pa
30de0 67 65 20 77 65 20 61 72 65 20 6d 6f 76 69 6e 67  ge we are moving
30df0 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   from..  */.  if
30e00 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
30e10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30e20 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
30e30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30e40 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rc;.  }..  /* If
30e50 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
30e60 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79 20 61  moved is dirty a
30e70 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  nd has not been 
30e80 73 61 76 65 64 20 62 79 20 74 68 65 20 6c 61 74  saved by the lat
30e90 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69  est.  ** savepoi
30ea0 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68  nt, then save th
30eb0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
30ec0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ts of the page i
30ed0 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75  nto the .  ** su
30ee0 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54  b-journal now. T
30ef0 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
30f00 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f  to handle the fo
30f10 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f  llowing scenario
30f20 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45  :.  **.  **   BE
30f30 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a  GIN;.  **     <j
30f40 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74  ournal page X, t
30f50 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e  hen modify it in
30f60 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20   memory>.  **   
30f70 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b    SAVEPOINT one;
30f80 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76  .  **       <Mov
30f90 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61  e page X to loca
30fa0 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20  tion Y>.  **    
30fb0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65   ROLLBACK TO one
30fc0 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ;.  **.  ** If p
30fd0 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77  age X were not w
30fe0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75  ritten to the su
30ff0 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20  b-journal here, 
31000 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  it would not.  *
31010 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  * be possible to
31020 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e   restore its con
31030 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22  tents when the "
31040 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22  ROLLBACK TO one"
31050 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
31060 77 65 72 65 20 69 73 20 70 72 6f 63 65 73 73 65  were is processe
31070 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62  d..  **.  ** sub
31080 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61  journalPage() ma
31090 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61  y need to alloca
310a0 74 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  te space to stor
310b0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f  e pPg->pgno into
310c0 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  ** one or mor
310d0 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76  e savepoint bitv
310e0 65 63 73 2e 20 54 68 69 73 20 69 73 20 74 68 65  ecs. This is the
310f0 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e   reason this fun
31100 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72  ction.  ** may r
31110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
31120 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  EM..  */.  if( p
31130 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
31140 44 49 52 54 59 0a 20 20 20 26 26 20 73 75 62 6a  DIRTY.   && subj
31150 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
31160 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f  ).   && SQLITE_O
31170 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72  K!=(rc = subjour
31180 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20  nalPage(pPg)).  
31190 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
311a0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
311b0 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE(("MOVE %d pa
311c0 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
311d0 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
311e0 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
311f0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
31200 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61  >pgno, (pPg->fla
31210 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
31220 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b  NC)?1:0, pgno));
31230 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
31240 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
31250 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
31260 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49  , pgno))..  /* I
31270 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  f the journal ne
31280 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
31290 65 64 20 62 65 66 6f 72 65 20 70 61 67 65 20 70  ed before page p
312a0 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a  Pg->pgno can.  *
312b0 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c  * be written to,
312c0 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
312d0 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
312e0 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  le needSyncPgno.
312f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
31300 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
31310 69 73 20 73 65 74 2c 20 74 68 65 72 65 20 69 73  is set, there is
31320 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
31330 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74  mber that.  ** t
31340 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
31350 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
31360 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
31370 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a  page pPg->pgno .
31380 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74    ** can be writ
31390 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
313a0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
313b0 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
313c0 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  rite to it..  */
313d0 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
313e0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
313f0 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74  NC) && !isCommit
31400 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
31410 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
31420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
31430 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
31440 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
31450 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
31460 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31470 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
31480 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73  _DIRTY );.    as
31490 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
314a0 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
314b0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
314c0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
314d0 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
314e0 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
314f0 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20  t.  ** from its 
31500 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
31510 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
31520 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
31530 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
31540 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
31550 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
31560 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
31570 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
31580 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
31590 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
315a0 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
315b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
315c0 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
315d0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
315e0 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
315f0 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f   !pPgOld || pPgO
31600 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20  ld->nRef==1 );. 
31610 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
31620 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
31630 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26   (pPgOld->flags&
31640 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
31650 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
31660 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  ){.      /* Do n
31670 6f 74 20 64 69 73 63 61 72 64 20 70 61 67 65 73  ot discard pages
31680 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f   from an in-memo
31690 72 79 20 64 61 74 61 62 61 73 65 20 73 69 6e 63  ry database sinc
316a0 65 20 77 65 20 6d 69 67 68 74 0a 20 20 20 20 20  e we might.     
316b0 20 2a 2a 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   ** need to roll
316c0 62 61 63 6b 20 6c 61 74 65 72 2e 20 20 4a 75 73  back later.  Jus
316d0 74 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  t move the page 
316e0 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79 2e 20  out of the way. 
316f0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
31700 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
31710 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 73 71  alid );.      sq
31720 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
31730 70 50 67 4f 6c 64 2c 20 70 50 61 67 65 72 2d 3e  pPgOld, pPager->
31740 64 62 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 7d  dbSize+1);.    }
31750 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
31760 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
31770 67 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  gOld);.    }.  }
31780 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70  ..  origPgno = p
31790 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69  Pg->pgno;.  sqli
317a0 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
317b0 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69  g, pgno);.  sqli
317c0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
317d0 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
317e0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
317f0 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
31800 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
31810 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
31820 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
31830 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
31840 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
31850 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
31860 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
31870 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
31880 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
31890 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
318a0 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
318b0 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
318c0 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
318d0 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
318e0 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72  .    ** "is jour
318f0 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c  naled" bitvec fl
31900 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ag has been set.
31910 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
31920 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20  e remedied by.  
31930 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65    ** loading the
31940 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
31950 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
31960 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
31970 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a  .needSync .    *
31980 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  * flag..    **. 
31990 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74     ** If the att
319a0 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65  empt to load the
319b0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
319c0 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c  age-cache fails,
319d0 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20   (due.    ** to 
319e0 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
319f0 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72   failure), clear
31a00 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20   the bit in the 
31a10 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20  pInJournal[].   
31a20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72   ** array. Other
31a30 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67  wise, if the pag
31a40 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20  e is loaded and 
31a50 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e  written again in
31a60 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61  .    ** this tra
31a70 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
31a80 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
31a90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31aa0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
31ab0 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f  t is synced into
31ac0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31ad0 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20  e. This way, it 
31ae0 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20  may end up in.  
31af0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
31b00 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74   file twice, but
31b10 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
31b20 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20  roblem..    **. 
31b30 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
31b40 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c  3PagerGet() call
31b50 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
31b60 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
31b70 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
31b80 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
31b90 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
31ba0 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
31bb0 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
31bc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31bd0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
31be0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
31bf0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
31c00 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
31c10 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
31c20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31c30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
31c40 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67  edSyncPgno<=pPag
31c50 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
31c60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31c70 28 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  ( pPager->pTmpSp
31c80 61 63 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ace!=0 );.      
31c90 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43    sqlite3BitvecC
31ca0 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e  lear(pPager->pIn
31cb0 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e  Journal, needSyn
31cc0 63 50 67 6e 6f 2c 20 70 50 61 67 65 72 2d 3e 70  cPgno, pPager->p
31cd0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
31ce0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
31cf0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
31d00 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
31d10 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   1;.    assert( 
31d20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
31d30 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  0 && !MEMDB );. 
31d40 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73     pPgHdr->flags
31d50 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
31d60 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  YNC;.    sqlite3
31d70 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
31d80 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c  pPgHdr);.    sql
31d90 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
31da0 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  PgHdr);.  }..  /
31db0 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  *.  ** For an in
31dc0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
31dd0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
31de0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
31df0 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20 74 6f 20  ntinues.  ** to 
31e00 65 78 69 73 74 2c 20 69 6e 20 63 61 73 65 20 74  exist, in case t
31e10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  he transaction n
31e20 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20 62 61 63  eeds to roll bac
31e30 6b 2e 20 20 55 73 65 20 70 50 67 4f 6c 64 0a 20  k.  Use pPgOld. 
31e40 20 2a 2a 20 61 73 20 74 68 65 20 6f 72 69 67 69   ** as the origi
31e50 6e 61 6c 20 70 61 67 65 20 73 69 6e 63 65 20 69  nal page since i
31e60 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
31e70 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 20 20  en allocated..  
31e80 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
31e90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
31ea0 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20  cheMove(pPgOld, 
31eb0 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20 20 20 73  origPgno);.    s
31ec0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
31ed0 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20  (pPgOld);.  }.. 
31ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31ef0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
31f00 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
31f10 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
31f20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
31f30 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
31f40 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
31f50 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
31f60 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
31f70 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d  ->nRef>0 || pPg-
31f80 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
31f90 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
31fa0 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pData;.}../*.** 
31fb0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
31fc0 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
31fd0 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
31fe0 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
31ff0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
32000 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
32010 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
32020 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
32030 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
32040 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
32050 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a  g->pExtra;.}../*
32060 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
32070 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
32080 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
32090 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
320a0 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
320b0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
320c0 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
320d0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
320e0 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
320f0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
32100 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
32110 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
32120 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
32130 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
32140 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
32150 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
32160 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
32170 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
32180 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
32190 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
321a0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
321b0 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
321c0 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
321d0 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
321e0 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
321f0 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
32200 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
32210 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
32220 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
32230 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
32240 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
32250 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
32260 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32270 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
32280 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
32290 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
322a0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
322b0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
322c0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
322d0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
322e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
322f0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
32300 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
32310 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
32320 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
32330 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
32340 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
32350 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
32360 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32370 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20   = (u8)eMode;.  
32380 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
32390 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
323a0 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eMode;.}../*.** 
323b0 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72  Get/set the jour
323c0 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  nal-mode for thi
323d0 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
323e0 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
323f0 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
32400 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
32410 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20  ODE_QUERY.**    
32420 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32430 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50  E_DELETE.**    P
32440 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32450 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  _TRUNCATE.**    
32460 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32470 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  E_PERSIST.**    
32480 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32490 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45  E_OFF.**    PAGE
324a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
324b0 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  MORY.**.** If th
324c0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
324d0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20  ot _QUERY, then 
324e0 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
324f0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
32500 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  * value specifie
32510 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20  d if the change 
32520 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65  is allowed.  The
32530 20 63 68 61 6e 67 65 20 69 73 20 64 69 73 61 6c   change is disal
32540 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  lowed.** for the
32550 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f   following reaso
32560 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ns:.**.**   *  A
32570 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
32580 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61  base can only ha
32590 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d  ve its journal_m
325a0 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a  ode set to _OFF.
325b0 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f  **      or _MEMO
325c0 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54  RY..**.**   *  T
325d0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  he journal mode 
325e0 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  may not be chang
325f0 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73  ed while a trans
32600 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
32610 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
32620 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68  rned indicate th
32630 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
32640 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75  bly updated) jou
32650 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
32660 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  t sqlite3PagerJo
32670 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
32680 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
32690 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
326a0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
326b0 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  NALMODE_QUERY.  
326c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
326d0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
326e0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20  LMODE_DELETE.   
326f0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32700 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32710 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20  MODE_TRUNCATE.  
32720 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32730 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32740 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
32750 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32760 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32770 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
32780 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
32790 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
327a0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61  DE_MEMORY );.  a
327b0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
327c0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30  RNALMODE_QUERY<0
327d0 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
327e0 3d 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42  =0.   && (!MEMDB
327f0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32800 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
32810 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
32820 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32830 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
32840 46 46 29 0a 20 20 20 26 26 20 21 70 50 61 67 65  FF).   && !pPage
32850 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20  r->dbModified.  
32860 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61   && (!isOpen(pPa
32870 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d  ger->jfd) || 0==
32880 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
32890 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ff).  ){.    if(
328a0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
328b0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71  jfd) ){.      sq
328c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
328d0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
328e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
328f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32900 54 52 55 4e 43 41 54 45 20 26 20 31 29 3d 3d 31  TRUNCATE & 1)==1
32910 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32920 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
32930 44 45 5f 50 45 52 53 49 53 54 20 26 20 31 29 3d  DE_PERSIST & 1)=
32940 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
32950 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
32960 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26 20 31 29  MODE_DELETE & 1)
32970 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
32980 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
32990 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20 31  LMODE_MEMORY & 1
329a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
329b0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
329c0 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 31 29 3d  ALMODE_OFF & 1)=
329d0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
329e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
329f0 64 65 20 26 20 31 29 3d 3d 31 20 26 26 20 28 65  de & 1)==1 && (e
32a00 4d 6f 64 65 20 26 20 31 29 3d 3d 30 0a 20 20 20  Mode & 1)==0.   
32a10 20 20 20 20 20 20 26 26 20 21 70 50 61 67 65 72        && !pPager
32a20 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
32a30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32a40 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
32a50 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
32a60 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
32a70 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   }.    pPager->j
32a80 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38  ournalMode = (u8
32a90 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65  )eMode;.  }.  re
32aa0 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
32ab0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
32ac0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
32ad0 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75  the size-limit u
32ae0 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65  sed for persiste
32af0 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
32b00 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20  ..**.** Setting 
32b10 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74  the size limit t
32b20 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69  o -1 means no li
32b30 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e  mit is enforced.
32b40 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74  .** An attempt t
32b50 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d  o set a limit sm
32b60 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73  aller than -1 is
32b70 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34   a no-op..*/.i64
32b80 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
32b90 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61  rnalSizeLimit(Pa
32ba0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34  ger *pPager, i64
32bb0 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20   iLimit){.  if( 
32bc0 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20  iLimit>=-1 ){.  
32bd0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
32be0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69  lSizeLimit = iLi
32bf0 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
32c00 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
32c10 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f  lSizeLimit;.}../
32c20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
32c30 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61  inter to the pPa
32c40 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72  ger->pBackup var
32c50 69 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75  iable. The backu
32c60 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62  p module.** in b
32c70 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e  ackup.c maintain
32c80 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  s the content of
32c90 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20   this variable. 
32ca0 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75  This module.** u
32cb0 73 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20  ses it opaquely 
32cc0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74  as an argument t
32cd0 6f 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52  o sqlite3BackupR
32ce0 65 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20  estart() and.** 
32cf0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
32d00 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  ate() only..*/.s
32d10 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a  qlite3_backup **
32d20 73 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b  sqlite3PagerBack
32d30 75 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61  upPtr(Pager *pPa
32d40 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26  ger){.  return &
32d50 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b  pPager->pBackup;
32d60 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
32d70 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
32d80 20 2a 2f 0a                                       */.